Spec-Zone.ru › Ruby on Rails 5.0

модуль 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>

В обоих случаях id и class обертывающего элемента DOM автоматически генерируются, следуя соглашениям об именовании, инкапсулированным в методах RecordIdentifier dom_id и dom_class:

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

Открытые методы экземпляров

dom_class(record_or_class, prefix = nil) Показать исходный код
# File actionview/lib/action_view/record_identifier.rb, line 72
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

Конвенция классов DOM — использовать единственное число объекта или класса.

dom_class(post)   # => "post"
dom_class(Person) # => "person"

Если вам нужно обратиться к нескольким экземплярам одного и того же класса в одном представлении, вы можете префикс метода #dom_class:

dom_class(post, :edit)   # => "edit_post"
dom_class(Person, :edit) # => "edit_person"
dom_id(record, prefix = nil) Показать исходный код
# File actionview/lib/action_view/record_identifier.rb, line 87
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"

Защищённые методы экземпляров

record_key_for_dom_id(record) Показать исходный код
# File actionview/lib/action_view/record_identifier.rb, line 105
def record_key_for_dom_id(record)
  key = convert_to_model(record).to_key
  key ? key.join(JOIN) : key
end

Возвращает строковое представление атрибута(ов) ключа, подходящее для использования в id HTML DOM. Это можно переопределить для настройки строкового представления по умолчанию. Если вам необходимо считать ключ из #dom_id для запроса записи в основной базе данных, вы должны написать помощник типа 'person_record_from_dom_id', который извлечёт ключ либо на основе реализации по умолчанию (которая просто соединяет все атрибуты ключа с «_»), либо на основе вашего переопределённого варианта метода. По умолчанию эта реализация передаёт строку ключа через метод, который заменяет все символы, недействительные в id DOM, на допустимые. Вам необходимо убедиться, что ваши id dom действительны, в случае, если вы переопределите этот метод.

© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API