36

当您有这样的表单字段时:

<%= f.text_field :last_name %>

它将在 HTML 中生成:

<input id="person_last_name" name="person[last_name]" size="30" type="text" />

我想知道是否有任何方法可以获取将生成的名称属性(在本例中为“person [last_name]”)。

想要得到它似乎有点奇怪,但我有我的理由!我也懒得开始冗长的解释。

4

4 回答 4

38

检查表单对象后,我发现您可以从中获取object_name

所以这对我来说效果很好:"#{f.object_name}[field_name]"

这将产生:object[object_attributes][0][field_name]

于 2013-10-02T16:54:18.257 回答
11

好吧,正如预期的那样,您的评论是非常真实的:)

发生这种情况的源代码中的位置是InstanceTag所有标记生成向下钻取的类。该方法称为tag_name

于 2011-02-07T14:17:40.317 回答
4
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_nametag_name_with_index都有可选参数multiple = false,用于数组(只是添加[]到生成名称的末尾)。

最后,如果您需要 id 而不是 name -tag_idtag_id_with_index分别,则有类似的方法。

于 2013-11-19T14:26:58.613 回答
1

Neutrino 的回答很棒。只是想添加我发现的内容,可能并不完全正确。但它对我有用。

在 action_view/helpers/form_tag_helper.rb 中找到以下方法

    def sanitized_object_name
      @sanitized_object_name ||= @object_name.gsub(/\]\[|[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "")
    end

希望能帮助到你。

于 2011-05-01T20:44:52.517 回答