フォームメソッドの微妙な言い回しに悩んだのでメモ。
フォームの開始
通信方法 メソッド 通常 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'} %>
_tagによる違い
違い メソッド データベースへの入力で利用 text_field object_name, method, options = {} 上記以外の一般的な値の取得 text_field_tag name, value = nil, options = {} _tagなしのテキストフィールド 利用例
@software = Software.find(params[:id])
- @ softwareにデータベースからインスタンスを代入。
<%= 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 %>