環境
- Rails5.2
- Slim
- Bootstrap
はじめに
ViewからControllerに値(パラメータ)を渡す場合、Viewに配置したsubmitのボタンを押して、画面に入力した値をControllerにPOSTする方法以外に、link_toを使って、GETでControllerに渡す方法があります。link_toを使って、値(パラメータ)をControllerに渡す方法について、色々とやってみました。
内容
seikyusクラスにsyori1という名前のメソッドを作ります。そして、ルート情報を次のように作ります。link_toで値を渡すときは、POSTではなくGETで渡します。
resources :seikyus do
get :syori1, on: :collection
end
「テスト」という値を、ViewからControllerに渡すには次のように記述します。
- test = "テスト"
= link_to "テスト1", syori1_seikyus_path(test)
Controllerの中で取得する場合は、次のように記述します。paramsでformatキーの中に「テスト」の値が入っています。
Rails.application.config.pri_logger.error(params[:format])
erbで書かれた内容をHTMLに置き換えると、次のようになっています。文字化けのように見える個所にはテストの値がセットされています。
<a href="/seikyus/syori1.%E3%83%86%E3%82%B9%E3%83%88">テスト1</a>
パラメータには変数ではなく、文字列をダイレクトにセットしてもOKです。Viewでは値だけを受け渡しただけのように見えますが、内部的にはparamsハッシュのformatキーに「テスト」の値をセットして受け渡したということになっています。
= link_to "テスト2", syori1_seikyus_path("テスト")
受け渡せるパラメータは1つだけです。2つパラメータをセットしてもエラーにはなりませんが、第2引数は拾ってくれません。params[:format]には「aa」だけがセットされます。
= link_to "テスト2", syori1_seikyus_path("aa","bb")
複数の値を渡したい場合は、次のようにハッシュにすると、受け渡すことができます。
= link_to "テスト3", syori1_seikyus_path(group_id: 1, team_id: 2)
Controller側では、Viewで設定したハッシュのキーを指定して値を取り出します。
Rails.application.config.pri_logger.error(params[:group_id])
Rails.application.config.pri_logger.error(params[:team_id])
HTMLの中身を見ると、このように、値がブラウザからサーバーにGETされることになります。
href="/seikyus/syori1?group_id=1&team_id=2"
Viewからハッシュで値を受け渡す場合、このような記述でもOKです。
= link_to "テスト4", syori1_seikyus_path(:group_id => 11, :team_id => 22)
ハッシュを変数にして受け渡してもOKです。
- aa = {"group_id" => 111, "team_id" => 222}
= link_to "テスト5" syori1_seikyus_path(aa)
参考
リンクの表示をsubmitボタンのような形式にした場合、classを指定するとボタン形式に変更することができます。
= link_to "テスト6", syori1_seikyus_path, class: "btn btn-primary"