为什么twitter-bootstrap-rails生成的视图使用的是model_class.human_attribute_name(:column)而不仅仅是字符串?

Mat*_*att 4 ruby-on-rails generator twitter-bootstrap twitter-bootstrap-rails

安装了twitter-bootstrap-rails,使用生成器:

rails g bootstrap:themed Model
Run Code Online (Sandbox Code Playgroud)

创建包含以下行的视图:

  <th><%= model_class.human_attribute_name(:comment_date) %></th>
  <th><%= model_class.human_attribute_name(:comment_time) %></th>
Run Code Online (Sandbox Code Playgroud)

默认rails生成器直接插入人类可读列名称:

 <th>Comment date</th>
 <th>Comment time</th>
Run Code Online (Sandbox Code Playgroud)

这使得视图更清晰,并且似乎在运行时更有效.

twitter-bootstrap-rails生成的视图有什么好处吗?

谢谢!

(PS,开发者网站是离线的,github和google +都不允许发送私信,github上的"问题"和google +帖子上的公开评论似乎都不适合这个问题,所以希望有人在这里熟悉model_class.human_attribute_name()的用例

jdo*_*doe 5

看看它的来源,事情会很清楚:

# File activemodel/lib/active_model/translation.rb, line 45
def human_attribute_name(attribute, options = {})
  defaults  = []
  parts     = attribute.to_s.split(".", 2)
  attribute = parts.pop
  namespace = parts.pop

  if namespace
    lookup_ancestors.each do |klass|
      defaults << :"#{self.i18n_scope}.attributes.#{klass.model_name.i18n_key}/#{namespace}.#{attribute}"
    end
    defaults << :"#{self.i18n_scope}.attributes.#{namespace}.#{attribute}"
  else
    lookup_ancestors.each do |klass|
      defaults << :"#{self.i18n_scope}.attributes.#{klass.model_name.i18n_key}.#{attribute}"
    end
  end

  defaults << :"attributes.#{attribute}"
  defaults << options.delete(:default) if options[:default]
  defaults << attribute.humanize

  options.reverse_merge! :count => 1, :default => defaults
  I18n.translate(defaults.shift, options)
end
Run Code Online (Sandbox Code Playgroud)

human_attribute_name在本地化您的属性名称方面做得很好.即使您正在构建仅使用英语的应用程序 - 谁知道,也许您的收件箱已经收到了客户关于其扩展业务计划的电子邮件,此扩展将包括人们从右向左书写的国家/地区.

这个怎么运作

假设您有Producttitle属性的模型.这样打电话human_attribute_name:

Product.human_attribute_name 'title'
Run Code Online (Sandbox Code Playgroud)

I18n.t使用以下参数调用(请参阅上面代码段中的最后一行):

I18.t 'activerecord.attributes.product.title', {
  :count=>1, 
  :default=>[:"attributes.title", "Title"] 
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以提供特定于某些模型的翻译,并且特定于某些属性的名称.除非您提供任何这些翻译,否则您将通过humanize方法获得您的属性的英文版本.