Action View 记录标识符
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>
在这两种情况下,包装 DOM 元素的 id
和 class
都是自动生成的,遵循由 RecordIdentifier
方法 dom_id
和 dom_class
封装的命名约定。
dom_id(Post) # => "new_post"
dom_class(Post) # => "post"
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 | = | "new" |
实例公共方法
dom_class(record_or_class, prefix = nil) 链接
DOM 类约定是使用对象或类的单数形式。
dom_class(post) # => "post"
dom_class(Person) # => "person"
如果您需要在同一个视图中处理同一个类的多个实例,您可以为 dom_class
添加前缀
dom_class(post, :edit) # => "edit_post"
dom_class(Person, :edit) # => "edit_person"
来源: 显示 | 在 GitHub 上
# File actionview/lib/action_view/record_identifier.rb, line 78 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_id(record_or_class, prefix = nil) 链接
DOM id 约定是使用对象的单数形式或类的名称,并在其后添加下划线和 id。如果找不到 id,则使用“new_”作为前缀。
dom_id(Post.find(45)) # => "post_45"
dom_id(Post) # => "new_post"
如果您需要在同一个视图中引用同一个类的多个实例,您可以为 dom_id
添加前缀。
dom_id(Post.find(45), :edit) # => "edit_post_45"
dom_id(Post, :custom) # => "custom_post"
来源: 显示 | 在 GitHub 上
# File actionview/lib/action_view/record_identifier.rb, line 93 def dom_id(record_or_class, prefix = nil) raise ArgumentError, "dom_id must be passed a record_or_class as the first argument, you passed #{record_or_class.inspect}" unless record_or_class record_id = record_key_for_dom_id(record_or_class) unless record_or_class.is_a?(Class) if record_id "#{dom_class(record_or_class, prefix)}#{JOIN}#{record_id}" else dom_class(record_or_class, prefix || NEW) end end
实例私有方法
record_key_for_dom_id(record) 链接
返回一个适合用在 HTML DOM id 中的键属性字符串表示形式。如果需要,可以覆盖此方法以自定义默认生成的字符串表示形式。如果您需要从 dom_id
中读取键以查询底层数据库记录,您应该编写一个类似于“person_record_from_dom_id”的辅助方法,该方法将根据默认实现(它只是将所有键属性连接起来,用“_”分隔)或您自己覆盖的版本来提取键。默认情况下,此实现将键字符串传递给一个方法,该方法将所有在 DOM id 中无效的字符替换为有效的字符。如果您覆盖了此方法,您需要自己确保您的 dom id 有效。
来源: 显示 | 在 GitHub 上
# File actionview/lib/action_view/record_identifier.rb, line 113 def record_key_for_dom_id(record) # :doc: key = convert_to_model(record).to_key key && key.all? ? key.join(JOIN) : nil end