SakuraWi - BLog

みんなのウェディングの新米エンジニア。聴いたお話をまとめておく倉庫的な。スタックストックスタック!

f.hidden_fieldとhidden_field_tagの使い方【Ruby on Rails】


form_forタグの中でパラメータを入力させないまま値を受け渡したい時に使用するものとして

hidden_fieldhidden_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="" />

valueという記述が省略することができるため、シンプルに見えますね。 HTMLとしての出力も書かれているので非常にわかりやすいです。

注意点

以下のコードは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

haml形式の記述になります。 以下のように、第一引数にオブジェクト名、第二引数部分にvalueとして受けわたす必要があります。

= f.hidden_field :shampoo_id, :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}" />

となっており、ドキュメントの引数では、valueにうまく値を渡せないようにみえます。 そのため、valueを直接指定してあげるとうまく動作します。

こっちの方がスマートな記述に見えますね。

= f.hidden_field :shampoo_id, value: shampoo.id

注意点

こちらの記述だと、paramsで引用する際には
params[:user][:email]に保存されます。

Userのモデルのnameカラムや、emailカラム、それぞれに受け渡したい場合は、こちらを利用する必要があります。

公式ドキュメント

詳しい内容は公式ドキュメントを参照しましょう。
Ruby on Rails API

qiitaの記事も参考にしました。
Ruby on Rails - hidden_fieldの使い方 - Qiita