LoginSignup
47
28

More than 5 years have passed since last update.

Rails5でパラメーターをredirect_toに直接渡す

Last updated at Posted at 2017-06-08

結論

  • Rails5にバージョンアップするにあたり、パラメーターがハッシュ継承じゃなくなり、またpermissionがなければパラメーターを簡単に次のパスに投げることができなくなってしまいました。参考
  • なので、パラメータをそのまま飛ばす時は、
  1. 必要な箇所にpermitをかけたのち
  2. 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
47
28
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
47
28