フォームメソッドの微妙な言い回しに悩んだのでメモ。

フォームの開始

通信方法 メソッド
通常 form_tag url_for_options = {}, options = {}, *parameters_for_url, &block
通常 start_form_tag
(form_tagと同じ)
url_for_options = {}, options = {}, *parameters_for_url, &block
Ajax form_remote_tag options = {}, &block

form_tagで囲っておくと、returnキーが押された時にフォームの送信が実行される。(text_areaでは改行になるが)link_to_remoteやsubmit_to_remoteを利用する時に、もしform_tagで囲ったままだと、リンクやボタンを押した時にはAjax送信、returnキーを入力した時には通常のページ送信となる。(この挙動に混乱してしまったので、今後は注意)この場合、form_remote_tagを利用するか、form_tagを削除してしまうべき。

フォームの送信

通信方法 形状 メソッド
通常 ボタン submit_tag value = "Save changes", options = {}
Ajax ボタン submit_to_remote name, value, options = {}
Ajax リンク link_to_remote name, options = {}, html_options = {}

link_to_remoteのリンクをボタンに替えたい時、単純にsubmit_to_remoteに置き換えたくなるが、そうするとエラーになる。設定値の並びに注意。submit_to_remoteの方が一つ多い。

link_to_remote name, options
nameがリンク文字列になる。
submit_to_remote name, value, options
valueがボタンに表示される文字列になる。
      • submit_to_remoteのnameにはどんな意味があるのだろう?使い道がよくわからない...。
使用例
<%= link_to_remote "検索", 
              :update => "list_update", 
              :submit => "store", 
              :url => {:action => 'list_update'} %>
<%= submit_to_remote "store", "検索", 
              :update => "list_update", 
              :submit => "store", 
              :url => {:action => 'list_update'} %>

フォームの終了

通信方法 メソッド
end_form_tag

通常/Ajaxにかかわらず、常にend_form_tagで閉じる。

_tagによる違い

違い メソッド
データベースへの入力で利用 text_field object_name, method, options = {}
上記以外の一般的な値の取得 text_field_tag name, value = nil, options = {}
_tagなしのテキストフィールド 利用例
@software = Software.find(params[:id])
<%= text_field 'software', 'title'  %>
<%= text_field 'software', 'description'  %>
<%= text_field 'software', 'url'  %>
  • それぞれのテキストフィールドにtitle、description、url列の値が入って表示される。
  • 上記フォームが送信されると、受信側ではparamsに以下の内容が代入される。
params = {:software=>{:title=>"入力されたtitle", :description=>"入力されたdescription", :url=>"入力されたurl"}}
  • つまり、以下のように操作することが可能。
    • params[:software] とすれば {:title=>"入力されたtitle", :description=>"入力されたdescription", :url=>"入力されたurl"} を取得
    • params[:software][:title] とすれば "入力されたtitle" を取得
Software.new(params[:software])
  • よって、params[:software]一回で、title、description、urlの値を取得できる。(つまり、params[:software]が展開されると以下と同等だ。)
    • Software.new(:title=>"入力されたtitle", :description=>"入力されたdescription", :url=>"入力されたurl")
_tag付きのテキストフィールド利用例
<%= text_field_tag("search", @search_word) %>
  • 検索ワードなどを入力する場合に利用。(データベースへの書き込みをしない値の入力で利用)
  • 上記フォームが送信されると、受信側ではparamsに以下の内容が代入される。
params = {:search=>"入力されたsearch"}
@search_word = params[:search]
  • フォームからのパラメーターは、params[:search]で取得。
  • 再び@search_wordに代入してtext_field_tagを描画すれば、検索ワードは保持される。

form_for関連

通信方法 メソッド
通常 form_for object_name, *args, &proc
通常 fields_for object_name, *args {|builder.new(object_name, object, self, options, block)| ...}
Ajax remote_form_for object_name, *args, &proc
Ajax form_remote_for
(remote_form_forと同じ)
object_name, *args, &proc
form_forの利用例

実際に使ったことはないが、form_forブロックの中では、先頭のform_forタグの中で宣言したことを省略できるらしい。

<% form_for :software, @software, :url => { :action => "create" } do |f| %>
  <%= f.text_field :title %>
  <%= f.text_area :description %>
  <%= f.text_field :url %>
<% end %>

通常のscaffoldで生成されるコードは以下のようになる。'software'を繰り返している。これだけではありがた味は感じないが、複数オプションを設定しても、form_forなら常にf.text_fieldだけで済んでしまう。

<%= start_form_tag :action => "create" %>
  <%= text_field 'software', 'title' %>
  <%= text_area 'software', 'description' %>
  <%= text_field 'software', 'url' %>
<%= end_form_tag %>