ActionView::Base
インスタンス メソッドform_for
は、最初の引数として文字列を受け入れることができます。編集フォーム内で一度に複数のオブジェクトを更新したい場合があります。form_for
そのため、最初の引数として、一連の角括弧をオブジェクト名と連結した文字列を渡すことができます(例: person[]
)。次に、人物オブジェクトの配列を反復処理し、人物オブジェクトに関連付けられた属性を渡すFormBuilder
などのインスタンス メソッドを呼び出すことができます。text_field
それはそれでいいし、理解できる。
しかし、私はソースを調べていて、これに出くわしました:
if @object_name.to_s.match(/\[\]$/)
if object ||= @template.instance_variable_get("@#{Regexp.last_match.pre_match}") and object.respond_to?(:to_param)
@auto_index = object.to_param
else
raise ArgumentError, "object[] naming but object param and @object var don't exist or don't respond to to_param: #{object.inspect}"
end
end
@object_name
のコンストラクタに渡される引数であり、 などにFormBuilder
渡される最初のパラメータを参照します。ここでは、文字列に角かっこが含まれているかどうかを確認し、含まれている場合は、テンプレートにインスタンス変数が含まれているかどうかを確認します (を返し、インスタンス変数を作成するために を補間します)。インスタンス変数はコントローラーからビュー レイヤーにコピーされるため、コントローラーで定義すると、 で使用できるようになります。編集フォームにいるので、存在するオブジェクトがあるとしましょう。ここで、レコードの を文字列として返すメソッドを呼び出します (form_for
user[]
ActionView::Base
@user
Regexp.last_match.pre_match
user
@
ActionView
@user
to_param
id
to_param
上書きされていない) を@auto_index
インスタンス変数に代入します。
これが私の質問です。@user
が存在し、 に1
割り当てられた の ID を持っているとしましょう@auto_index
。しかし、角括弧で囲まれた文字列をチェックしている場合user[]
、明らかに の配列が期待されているid
ため、ユーザー オブジェクトのコレクションを取得してすべての ID を割り当てるのではなく、1 つのオブジェクトのみをチェックして自動インデックスに割り当てるのはなぜですか。自動索引付けするには?
1197 行を参照してください。
https://github.com/rails/rails/blob/master/actionpack/lib/action_view/helpers/form_helper.rb