Как получить HTML-атрибут 'name', который сгенерирует конструктор rails для определенного поля? - PullRequest
33 голосов
/ 07 февраля 2011

Когда у вас есть поле формы, такое как:

<%= f.text_field :last_name %>

сгенерирует это в HTML:

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

Я хотел бы знать, есть ли способ получить атрибут имени (в данном случае "person [last_name]"), который будет сгенерирован.

Кажется немного странным хотеть получить, но у меня есть свои причины! Я также не могу возиться с длинным объяснением.

Ответы [ 4 ]

35 голосов
/ 02 октября 2013

После проверки объекта формы я обнаружил, что из него можно получить object_name.

Так что это хорошо сработало для меня: "#{f.object_name}[field_name]"

Который будет генерировать: object[object_attributes][0][field_name]

9 голосов
/ 07 февраля 2011

Ну, как и следовало ожидать, ваш комментарий вполне верен:)

Место в источнике, где это происходит, - класс InstanceTag, к которому относится все поколение тегов. Метод называется tag_name .

3 голосов
/ 19 ноября 2013
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, который используется для массивов (просто добавляет [] в конец сгенерированного имени).

Наконец, есть аналогичные методы, еслинужен идентификатор вместо имени - tag_id и tag_id_with_index соответственно.

1 голос
/ 02 мая 2011

Ответ Нейтрино великолепен.Просто хочу добавить то, что нашел, может быть не совсем верно.Но это сработало для меня.

Найдите метод ниже в action_view / helpers / form_tag_helper.rb

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

Надеюсь, это поможет.

...