Подтвердить что ты не робот

Как получить атрибут "имя" HTML, построитель формы rails будет генерировать для определенного поля?

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

<%= f.text_field :last_name %>

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 4

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

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

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

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