1

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_foruser[]ActionView::Base@userRegexp.last_match.pre_matchuser@ActionView@userto_paramidto_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

4

0 に答える 0