4

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

rails g bootstrap:themed Model

创建包含以下行的视图:

  <th><%= model_class.human_attribute_name(:comment_date) %></th>
  <th><%= model_class.human_attribute_name(:comment_time) %></th>

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

 <th>Comment date</th>
 <th>Comment time</th>

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

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

谢谢!

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

4

1 回答 1

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

human_attribute_name在本地化属性名称方面做得很好。即使您正在构建仅使用英语的应用程序——谁知道呢,也许您的收件箱已经收到了一封来自您的客户的电子邮件,关于他扩展业务的计划,并且这种扩展将包括人们从右到左书写的国家。

这个怎么运作

假设您有具有属性的Product模型。title这样调用human_attribute_name

Product.human_attribute_name 'title'

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

I18.t 'activerecord.attributes.product.title', {
  :count=>1, 
  :default=>[:"attributes.title", "Title"] 
}

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

于 2012-06-10T21:12:54.163 回答