модуль ActionView::RecordIdentifier
RecordIdentifier инкапсулирует методы, используемые различными ActionView помощниками для ассоциации записей с элементами DOM.
Рассмотрим, например, следующий код формы для публикации:
<%= form_for(post) do |f| %> <%= f.text_field :body %> <% end %>
Когда post является новой, несохранённой ActiveRecord::Base записью, результирующий HTML будет:
<form class="new_post" id="new_post" action="/posts" accept-charset="UTF-8" method="post"> <input type="text" name="post[body]" id="post_body" /> </form>
Когда post является сохранённой ActiveRecord::Base записью, результирующий HTML будет:
<form class="edit_post" id="edit_post_42" action="/posts/42" accept-charset="UTF-8" method="post"> <input type="text" value="What a wonderful world!" name="post[body]" id="post_body" /> </form>
В обоих случаях, RecordIdentifier методы dom_id и dom_class автоматически генерируют атрибуты `class` и `id` обертывающего элемента DOM, следуя соглашениям об именовании.
dom_id(Post.new) # => "new_post" dom_class(Post.new) # => "post" dom_id(Post.find 42) # => "post_42" dom_class(Post.find 42) # => "post"
Обратите внимание, что эти методы не требуют, чтобы Post был подклассом ActiveRecord::Base. Любой класс Post будет работать, если его экземпляры поддерживают методы to_key и model_name, при условии, что model_name поддерживает метод param_key. Например:
class Post
attr_accessor :to_key
def model_name
OpenStruct.new param_key: 'post'
end
def self.find(id)
new.tap { |post| post.to_key = [id] }
end
end
Константы
- JOIN
- NEW
Открытые методы экземпляров
# File actionview/lib/action_view/record_identifier.rb, line 74
def dom_class(record_or_class, prefix = nil)
singular = model_name_from_record_or_class(record_or_class).param_key
prefix ? "#{prefix}#{JOIN}#{singular}" : singular
end Соглашение для атрибута `class` в DOM — использовать единственное число от объекта или класса.
dom_class(post) # => "post" dom_class(Person) # => "person"
Если вам нужно обращаться к нескольким экземплярам одного класса в одном представлении, вы можете префиксровать dom_class:
dom_class(post, :edit) # => "edit_post" dom_class(Person, :edit) # => "edit_person"
# File actionview/lib/action_view/record_identifier.rb, line 89
def dom_id(record, prefix = nil)
if record_id = record_key_for_dom_id(record)
"#{dom_class(record, prefix)}#{JOIN}#{record_id}"
else
dom_class(record, prefix || NEW)
end
end Соглашение для атрибута `id` в DOM — использовать единственное число от объекта или класса с добавлением символа подчеркивания после id. Если id не найден, используется префикс «new_».
dom_id(Post.find(45)) # => "post_45" dom_id(Post.new) # => "new_post"
Если вам нужно обращаться к нескольким экземплярам одного класса в одном представлении, вы можете префиксровать dom_id:
dom_id(Post.find(45), :edit) # => "edit_post_45" dom_id(Post.new, :custom) # => "custom_post"
Закрытые методы экземпляров
# File actionview/lib/action_view/record_identifier.rb, line 106 def record_key_for_dom_id(record) # :doc: key = convert_to_model(record).to_key key ? key.join(JOIN) : key end
Возвращает строковое представление атрибута(ов) ключа, подходящее для использования в атрибуте `id` элемента DOM. Этот метод можно переопределить для настройки генерируемой строки. Если необходимо получить ключ из dom_id для запроса записи в базе данных, напишите вспомогательный метод типа 'person_record_from_dom_id', который извлекает ключ, либо используя реализацию по умолчанию (соединяя все атрибуты ключа с '_'), либо используя переопределённую версию метода. По умолчанию эта реализация пропускает строку ключа через метод, который заменяет все недопустимые символы в идентификаторах DOM на допустимые. Вам необходимо убедиться, что ваши идентификаторы DOM являются допустимыми, в случае если вы переопределите этот метод.
© 2004–2020 David Heinemeier Hansson
Licensed under the MIT License.