Hatena::ブログ(Diary)

ザリガニが見ていた...。 このページをアンテナに追加 RSSフィード

2007-01-23 並び替え、フィルター、検索

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

フォームの開始

通信方法メソッド
通常form_tagurl_for_options = {}, options = {}, *parameters_for_url, &block
通常start_form_tag
(form_tagと同じ)
url_for_options = {}, options = {}, *parameters_for_url, &block
Ajaxform_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_remotename, value, options = {}
Ajaxリンクlink_to_remotename, 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_fieldobject_name, method, options = {}
上記以外の一般的な値の取得text_field_tagname, 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_forobject_name, *args, &proc
通常fields_forobject_name, *args {|builder.new(object_name, object, self, options, block)| ...}
Ajaxremote_form_forobject_name, *args, &proc
Ajaxform_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 %>

t98907t98907 2010/07/20 20:44 わかりやすいです。
ステキ記事でした。

zariganitoshzariganitosh 2010/07/20 21:08 嬉しいコメントを頂きました。
ありがとうございます。

satousatou 2011/01/15 10:31 ずっともやもやしていたことが解消されました!
素晴らしいまとめです。
こういうまとめは本当に役立ちます。

zariganitoshzariganitosh 2011/01/16 06:50 satou さん、

嬉しいコメントを頂きました。
ありがとうございます。
Railsかじり始め当時の、混乱していた自分を思い出しました。

今読み返すと、form_forの説明が薄っぺらいなと思いました。
Railsの神髄の一つは、form_forにあると感じています。
是非、この1年後に書いたform_forの日記も読んで頂けたら、と思います。
一番下の「さらに詳しく」にリンクされています。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/zariganitosh/20070123/1169537414