Ответ 1
Хорошо, как и ожидалось, комментарий, который у вас есть, совершенно прав:)
Место в источнике, где это происходит, - это класс InstanceTag
, с которым начинается генерация всех тегов. Этот метод называется tag_name.
Когда у вас есть поле формы, например:
<%= f.text_field :last_name %>
он сгенерирует это в HTML:
<input id="person_last_name" name="person[last_name]" size="30" type="text" />
Я хотел бы знать, есть ли способ получить атрибут name (в данном случае "person [last_name]" ), который будет сгенерирован.
Кажется, что-то странное, чего хочется, но у меня есть мои причины! Я также не могу быть обеспокоен запуском в длинное объяснение тоже.
Хорошо, как и ожидалось, комментарий, который у вас есть, совершенно прав:)
Место в источнике, где это происходит, - это класс InstanceTag
, с которым начинается генерация всех тегов. Этот метод называется tag_name.
После проверки объекта формы я обнаружил, что вы можете получить object_name
от него.
Итак, это сработало для меня: "#{f.object_name}[field_name]"
Что будет генерировать: object[object_attributes][0][field_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
, который используется для массивов (просто добавляет []
в конец сгенерированного имени).
Наконец, существуют аналогичные методы, если вам нужен идентификатор вместо имени - tag_id
и tag_id_with_index
соответственно.
Ответ на нейтрино велик. Просто хочу добавить то, что я нашел, возможно, не совсем правильно. Но это сработало для меня.
Найти ниже метод в action_view/helpers/form_tag_helper.rb
def sanitized_object_name
@sanitized_object_name ||= @object_name.gsub(/\]\[|[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "")
end
Надеюсь, это поможет.