結論
- Rails5にバージョンアップするにあたり、パラメーターがハッシュ継承じゃなくなり、またpermissionがなければパラメーターを簡単に次のパスに投げることができなくなってしまいました。参考
- なので、パラメータをそのまま飛ばす時は、
- 必要な箇所にpermitをかけたのち
- to_hをつけてハッシュ化して渡す
プロセスが必要
# params = {"user"=>{"name"=>"asd", "age"=>"12"}}に対して
params.class
# => ActionController::Parameters
# これは無理
params.to_h
# => unable to convert unpermitted parameters to hash
params.permit(user: :name).to_h
# => {"user"=>{"name"=>"asd"}}
実際にredirect_toに渡す場合
# app/views/users/first.html.erb
<%= form_for @user, url: users_second_path, method: :get do |f| %>
<%= f.text_field :name, placeholder: '名前' %>
<%= f.number_field :age, placeholder: '年齢' %>
<%= f.submit %>
<% end %>
# app/controllers/user_controller.rb
# 最初にパラメーターを飛ばすアクション
def first
@user = User.new
end
# パラメーターを受け取って別の場所へリダイレクトさせるアクション
def second
# これは問題外。unable to convert unpermitted parameters to hash
# redirect_to users_third_path(params)
# かといってこれでもダメ。unable to convert unpermitted parameters to hash
# redirect_to users_third_path(user: user[:params])
# これでいける
redirect_to users_third_path(user: user_params)
end
# 最終的にパラメーターをキャッチするアクション
def third
name = user_params[:user]
end
def user_params
params.require(:user).permit(:name, :age)
end