入力欄が5つあるのですが、ユーザーは1つでも5つでも構わないという仕組みです。
複数の時は each を使い分解して処理し、1つの時はそのまま処理をしたいのですが、複数か1つかを見分ける方法がわからず困っています。どのようにしたら判別することができますか?
これが追記のコードです。if times.instance_of?(Array) の箇所をどうにかしたいです。
# instance_of?(Array) は必ず falseになってしまうため困っている times = params[:user][:note][:datetime] if times.instance_of?(Array) times.each do |time| if include_validate_time?(time) @user.notes.create(user_id: user_id.to_i, datetime: normalize_time(time)) normalize_time(time) end end else if include_validate_time?(times["0"]) @user.notes.create(user_id: user_id.to_i, datetime: normalize_time(times["0"])) end # datetimeフィールドで送信すると変になるから一つにまとめるためのメソッド def normalize_time(time) y = time["(1i)"] mo = time["(2i)"] d = time["(3i)"] h = time["(4i)"] mi = time["(5i)"] Time.new(y,mo,d,h,mi) end
ーーーーーーーーーー追記
ruby
1#日付を一つにした場合 2 3[1] pry(#<UsersController>)> times.is_a?(Hash) 4=> false 5[2] pry(#<UsersController>)> times.class 6=> ActionController::Parameters 7[3] pry(#<UsersController>)> times 8=> <ActionController::Parameters {"0"=>{"(1i)"=>"2017", "(2i)"=>"6", "(3i)"=>"2", "(4i)"=>"00", "(5i)"=>"00"}, "1"=>{"(1i)"=>"", "(2i)"=>"", "(3i)"=>"", "(4i)"=>"", "(5i)"=>""}} permitted: false> 9 10 11 12 13#日付を2つにした場合 14 15 16[5] pry(#<UsersController>)> times 17=> <ActionController::Parameters { 18"0"=> 19{"(1i)"=>"2018", "(2i)"=>"2", "(3i)"=>"1", "(4i)"=>"02",(5i)"=>"00"}, 20 21"1"=>{"(1i)"=>"2018", "(2i)"=>"1", "(3i)"=>"7", "(4i)"=>"01", "(5i)"=>"20"}} permitted: false> 22 23[6] pry(#<UsersController>)> times.class 24=> ActionController::Parameters 25[7] pry(#<UsersController>)> times.is_a?(Hash) 26=> false 27
変わらないですねー。どちらも Parameters というクラスになってます。あと関係あるかどうかわかりませんが、僕がform をいじってしまっているのもあって、paramas の中のキーに 0 とか 1 が紛れ込んでいるんです。
他の方は length とか size を使った例を教えてくださっているのですが、Parameters クラスには定義されてないようで使えないんです。
ーーーーーーーーーーさらに追記
pamrams に 0 とか 1 が自動で追記されることを利用して、
times.has_key?("1")
こうすればできました。が、汎用性も、拡張性も悪いのでもっとスマートな書き方が知りたいです!
ーーーーーーーーーーー最後の追記
完成しました!みなさまありがとうございました!
最後の ArgumentError はご覧の通り時間の入っている params に空のハッシュがあるからです。これは別のメソッドを使って取り除いています。
ruby
1pry(#<EventsController>)> time = Array(params[:user][:note][:datetime]) 2=> [<ActionController::Parameters {"(1i)"=>"2018", "(2i)"=>"3", "(3i)"=>"5", "(4i)"=>"03", "(5i)"=>"10"} permitted: false>, 3 <ActionController::Parameters {"(1i)"=>"", "(2i)"=>"", "(3i)"=>"", "(4i)"=>"", "(5i)"=>""} permitted: false>] 4 5pry(#<EventsController>)> Array(params[:event][:invites][:datetime]).each {|t| p normalize_time t} 62018-03-05 03:10:00 +0900 7ArgumentError: argument out of range 8
回答2件
あなたの回答
tips
プレビュー