当您有这样的表单字段时:
<%= f.text_field :last_name %>
它将在 HTML 中生成:
<input id="person_last_name" name="person[last_name]" size="30" type="text" />
我想知道是否有任何方法可以获取将生成的名称属性(在本例中为“person [last_name]”)。
想要得到它似乎有点奇怪,但我有我的理由!我也懒得开始冗长的解释。
当您有这样的表单字段时:
<%= f.text_field :last_name %>
它将在 HTML 中生成:
<input id="person_last_name" name="person[last_name]" size="30" type="text" />
我想知道是否有任何方法可以获取将生成的名称属性(在本例中为“person [last_name]”)。
想要得到它似乎有点奇怪,但我有我的理由!我也懒得开始冗长的解释。
检查表单对象后,我发现您可以从中获取object_name
。
所以这对我来说效果很好:"#{f.object_name}[field_name]"
这将产生:object[object_attributes][0][field_name]
好吧,正如预期的那样,您的评论是非常真实的:)
发生这种情况的源代码中的位置是InstanceTag
所有标记生成向下钻取的类。该方法称为tag_name。
ActionView::Helpers::InstanceTag.new(
ActiveModel::Naming.param_key(@object_in_form_for),
:your_attribute,
:this_param_is_ignored
).send(:tag_name)
还有一个tag_name_with_index
属性接受索引作为第一个参数。两者tag_name
和tag_name_with_index
都有可选参数multiple = false
,用于数组(只是添加[]
到生成名称的末尾)。
最后,如果您需要 id 而不是 name -tag_id
和tag_id_with_index
分别,则有类似的方法。
Neutrino 的回答很棒。只是想添加我发现的内容,可能并不完全正确。但它对我有用。
在 action_view/helpers/form_tag_helper.rb 中找到以下方法
def sanitized_object_name
@sanitized_object_name ||= @object_name.gsub(/\]\[|[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "")
end
希望能帮助到你。