はじめに
Ruby on Railsで、form_with
タグの中でパラメータを直接フォームから入力させないまま、値を受け渡したい時に使用するものとして、hidden_field
とhidden_field_tag
があります。自分はコントローラで保持しているuser_id
を次のアクションに渡したい。ってときにけっこうこれを知るまで苦戦していたので簡単にまとめてみました。
対象ユーザ
Rails触り始めた人
フォームを実装している人
使い方
form_with
の内部で使用するか、単体で使用するか、という使い方にあります。
form_with
で渡すインスタンスがある場合(もしくはそれらのヘルパーを使っている場合)は、f.hidden_field
を使う。 1個だけパラメータを単体で渡したい時は、hidden_field_tag
を使う。
hidden_field_tag
hidden_field_tagの方が使用方法はシンプルに見えます。
<%= hidden_field_tag :email, @user.email %>
公式ドキュメントの例はこちら。
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="" />
hidden_field_tag どのシンボルに(第一引数)、どの値を渡すか(第二引数)、という記述。
hidden_field
以下のように、第一引数にオブジェクト名、第二引数部分にvalueとして受けわたす必要があります。
公式ドキュメントによると、
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_with
の部分で@user
などといったインスタンスを渡しているので、そのインスタンスの属性と値を指定してあげます。
まとめると、f.hidden_field
その属性か、値は何か、という書き方
注意点
こちらの記述だと、params
で引用する際には,params[:user][:email]
に保存されます。
理由は、@userの、email属性に、valueで渡した値を格納しているからですね。モデルのインスタンスの属性に格納しているから。
公式ドキュメント
詳しい内容は公式ドキュメントを参照しましょう。
https://api.rubyonrails.org/