Ruby on Railsでは、form_with
やform_for
タグの中でパラメータをユーザが直接フォームから入力させないまま、値を受け渡したい時に使用するものとして
hidden_field
とhidden_field_tag
があります。
controller
で保持している user_id
を次のアクションに渡したい、といった時に利用します。
formではユーザの名前などの情報を入力してもらって、裏側でuser_id
を渡すイメージです。
使い方に少し注意が必要であるため、使用方法をまとめました。
また Ruby on Railsチュートリアルや初心者にとってこのふたつの違いはわかりにくいですし、混乱すると思うのでなるべくわかりやすく解説しようと思います。
対象読者
- Rails触り始めた人、入門者
- フォームを実装している人
- f.hidden_fieldとhidden_field_tagの使い方
- hidden_field_tagについて
- hidden_fieldについて
- f.hidden_fieldとhidden_field_tagのまとめ
- 参考
f.hidden_fieldとhidden_field_tagの使い方
おおまかな違いは、 form_withやform_forの内部で使用するか、単体で使用するか、という使い方にあります。
form_withやform_forで渡すインスタンスがある場合(もしくはそれらのヘルパーを使っている場合)は、f.hidden_field
を使います。
一個だけパラメータを他のアクションへ単体で渡したい時は、hidden_field_tag
を使います。
hidden_field_tag
は独立して利用できます。
hidden_field_tagについて
hidden_field_tag
の方が使用方法はシンプルです。
<%= hidden_field_tag :email, @user.email %>
上記では、emailというパラメータに、 @user.email
の情報を渡しています。
rails serverで立ち上げているターミナルで、送信されたパラメータをチェックしてみましょう。
Parameters: {"utf8"=>"✓", "authenticity_token"=>"estvl2Qof29PNJrhiq59BmjeFMlVfXI4JqlzAY3oC/AyP3gTOKhj4VT5fyIm8FMPUEVTZ7rRHJ0LoYTVLaa2Zw==", "completed_item"=>{"title"=>"aaa"}, "email"=>"aaa", "commit"=>"できた!"}
"email"=>"aaa"
といったようにパラメータが送信されているのがわかります。
公式ドキュメントの例はこちら。
hidden_field_tag 'tags_list' # => <input id="tags_list" name="tags_list" type="hidden" /> hidden_field_tag 'token', 'VUBJKB23UIVI1UU1VOBVI@' # => <input id="token" name="token" type="hidden" value="VUBJKB23UIVI1UU1VOBVI@" /> hidden_field_tag 'collected_input', '', onchange: "alert('Input collected!')" # => <input id="collected_input" name="collected_input" onchange="alert('Input collected!')" # type="hidden" value="" />
第一引数に:id
のようにシンボルで記述します。第二引数はvalue
、つまり渡したい値になります。
HTMLとしての出力も書かれているので非常にわかりやすいです。
hidden_field_tag どのようなシンボルに(第一引数)、どの値を渡すか(第二引数)
、という記述ですね。
注意点
params[:email]
のようにハッシュを使って値を取り出す際に注意が必要です。
以下のコードはRails tutorialの10章より抜粋
<%= form_for(@user, url: password_reset_path(params[:id])) do |f| %> <%= render 'shared/error_messages' %> <%= hidden_field_tag :email, @user.email %> <%= f.label :password %> <%= f.password_field :password, class: 'form-control' %> <%= f.label :password_confirmation, "Confirmation" %> <%= f.password_field :password_confirmation, class: 'form-control' %> <%= f.submit "Update password", class: "btn btn-primary" %>
このように<%= hidden_field_tag :email, @user.email %>
では、
params[:email]で中身を参照できます。
hidden_fieldについて
次はform_with
の中で使うケースが多いhidden_field
を見ていきましょう。
こちらはhaml形式の記述になります。
hidden_field
は以下のように、
第一引数にパラメータ名(シンボル)、第二引数部分にvalueとして受け渡す必要があります。
= f.hidden_field :shampoo_id, :value => shampoo.id
もしくは @shampoo をform_forで渡しているのであれば、
= f.hidden_field :shampoo, :value => shampoo.id
でも大丈夫です。
公式ドキュメントによると、
hidden_field(:signup, :pass_confirm) # => <input type="hidden" id="signup_pass_confirm" name="signup[pass_confirm]" value="#{@signup.pass_confirm}" /> hidden_field(:post, :tag_list) # => <input type="hidden" id="post_tag_list" name="post[tag_list]" value="#{@post.tag_list}" /> hidden_field(:user, :token) # => <input type="hidden" id="user_token" name="user[token]" value="#{@user.token}" />
となっています。 form_forの部分で@userなどといったインスタンスを渡しているので、そのインスタンスの属性と値を指定してあげます。
()を省略するとスマートな記述に見えますね。
= f.hidden_field :shampoo_id, value: shampoo.id
まとめると、f.hidden_field そのインスタンスの属性、渡したい値は何か
、という書き方ですね。
注意点
こちらの記述だと、paramsで引用する際には
params[:user][:email]
に保存されます。
理由は、パラメータがネストしているためです。userが持つ、emailは、中身
とかけば伝わりやすいでしょうか。
Userのモデルのnameカラムや、emailカラム、それぞれに受け渡したい場合は、こちらを利用するとわかりやすいでしょう。
f.hidden_fieldとhidden_field_tagのまとめ
Ruby on Railsを使った時のf.hidden_fieldとhidden_field_tagの違いをまとめました。
form_withを使っているviewファイルではf.hidden_field
を利用することがほとんどで、それ以外ではhidden_field_tag
で個別にパラメータに好きな情報を送ることができます。
ユーザに直接入力させることなく何かの値の受け渡しを行いたい場合は利用してみましょう。
公式ドキュメント
詳しい内容は公式ドキュメントを参照しましょう。
Ruby on Rails API
参考
qiitaの記事も参考にしました。
Ruby on Rails - hidden_fieldの使い方 - Qiita