当你有一个这样的表单字段时:
<%= f.text_field :last_name %>
它将在HTML中生成:
<input id="person_last_name" name="person[last_name]" size="30" type="text" />
我想知道是否有任何方法可以获取将要生成的name属性(在本例中为“person [last_name]”)。
想要得到这似乎有点奇怪,但我有理由!我也不会费心去做一个冗长的解释。
答案 0 :(得分:35)
检查表单对象后,我发现您可以从中获取object_name
。
所以这对我很有用:"#{f.object_name}[field_name]"
将生成:object[object_attributes][0][field_name]
答案 1 :(得分:9)
嗯,正如预期的那样,你的评论是完全正确的:)
源中发生这种情况的地方是InstanceTag
类,所有标记生成都向下钻取。该方法称为tag_name。
答案 2 :(得分:3)
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而不是名称 - tag_id
和tag_id_with_index
,则有类似的方法。
答案 3 :(得分:1)
中微子的答案很棒。只是想添加我发现的东西,可能不完全正确。但它对我有用。
在action_view / helpers / form_tag_helper.rb
中查找以下方法 def sanitized_object_name
@sanitized_object_name ||= @object_name.gsub(/\]\[|[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "")
end
希望它有所帮助。