labelled_form_forについて

532 views
Skip to first unread message

aki

unread,
Nov 25, 2012, 12:15:33 PM11/25/12
to redmine-...@googlegroups.com
akiです。

redmineのコードを読んでいて、以下質問です。
最近、redmineのコードに興味を覚えた新参者です。よろしくお願いします。

application_helper.rbのlabeled_form_forの以下の以下のコードで質問です。

labelled_tabular_form_forから何らかの理由で、移行してきたらしいということまでは、
調べたのですが、コードの内容、理由など調べきれませんでした。

現在は以下のようなコードになっています。

def labelled_form_for(*args, &proc)
    args << {} unless args.last.is_a?(Hash)
    options = args.last
    if args.first.is_a?(Symbol)
      options.merge!(:as => args.shift)
    end
    options.merge!({:builder => Redmine::Views::LabelledFormBuilder})
    form_for(*args, &proc)
  end

質問
1. どんな処理でしょうか?なぜ、form_forではまずいのでしょうか?
  (最初の引数がシンボルの場合、:asとのハッシュになるようにしているように見えますが、詳細がわかりません。)
2. :asはどんな引数でしょうか?
  (いろいろしらべたのですが。。。)
3. 元のlabelled_tabular_form_forは何がわるかったのでしょうか?
  (「Redmineコード検索」で調べても出てきませんでした。もう完全排除されているのですね。)

以上、よろしくお願いします。

※redmineの使用法とは関係ないので、もし、他のメーリングリストが妥当であればご教示ください。

aki

nobu_toyofuku

unread,
Nov 28, 2012, 3:57:12 AM11/28/12
to Redmine Users (japanese)
  豊福です。

2012年11月26日 2:15 aki <aki...@gmail.com>:
> application_helper.rbのlabeled_form_forの以下の以下のコードで質問です。
 ...

> 1. どんな処理でしょうか?なぜ、form_forではまずいのでしょうか?
>   (最初の引数がシンボルの場合、:asとのハッシュになるようにしているように見えますが、詳細がわかりません。)

各form_for毎に :builder => ... 等を追加するのを省くためではないでしょうか。
処理はコードのとおり最初の引数がシンボルの場合、オプションに :as => シンボル を追加して
:builder => Redmine::Views::LabelledFormBuilder も追加してから form_for を呼んで
いるようです。

> 2. :asはどんな引数でしょうか?

actionpack-3.2.8/lib/action_view/helpers/form_helper.rb に

  def form_for(record, options = {}, &proc)
    ...
    case record
    when String, Symbol
      object_name = record
      object      = nil
    else
      object      = record.is_a?(Array) ? record.last : record
      object_name = options[:as] || ActiveModel::Naming.param_key(object)
      apply_form_for_options!(record, options)
    end

とあって object_name がフォームで使う入力パラメータの名前になるようです。
例えば wiki の編集の app/views/wiki/edit.html.erb では
  <%= form_for @content, :as => :content, ... %>
となっていますが :as を使わなければ ActiveModel::Naming.param_key(object) が
"wiki_content" なので入力項目が
  <label>コメント</label><input id="wiki_content_comments" name="wiki_content[comments]" ...>
なるところが :as => :content によって
  <label>コメント</label><input id="content_comments" name="content[comments]" ...>
のようになっています。


> 3. 元のlabelled_tabular_form_forは何がわるかったのでしょうか?
>   (「Redmineコード検索」で調べても出てきませんでした。もう完全排除されているのですね。)

redmine-1.4 までは labelled_tabular_form_for labelled_form_for の両方があって

  def labelled_tabular_form_for(*args, &proc)
    ActiveSupport::Deprecation.warn "ApplicationHelper#labelled_tabular_form_for is deprecated and will be removed in Redmine 1.5. Use #labelled_form_for instead."

    args << {} unless args.last.is_a?(Hash)
    options = args.last
    options[:html] ||= {}
    options[:html][:class] = 'tabular' unless options[:html].has_key?(:class)

    options.merge!({:builder => Redmine::Views::LabelledFormBuilder})
    form_for(*args, &proc)
  end

  def labelled_form_for(*args, &proc)
    args << {} unless args.last.is_a?(Hash)
    options = args.last
    options.merge!({:builder => Redmine::Views::LabelledFormBuilder})
    form_for(*args, &proc)
  end

となっていて 2.0 から labelled_form_for に一本化されたようです。
両者の違いはフォームに class="tabular" を付けるかどうかだけで 2.0 以降では
app/views/issues/new.html.erb
  <%= labelled_form_for @issue, :url => project_issues_path(@project), ... %>
    <div class="box tabular">
のようにフォームの一階層下で明示的に tabular を設定するようにして labelled_tabular_form_for
をいらなくしたのだと思います。
---

Reply all
Reply to author
Forward
0 new messages