Rails 4 - 在模型中标题为读取,保存时为小写

时间:2014-06-21 01:19:21

标签: ruby-on-rails models

我确定这是一个非常愚蠢的问题,但我无法弄明白。

在我的用户模型中,我有一个

`before_save :downcase_username` #because I use custom subdomain for each user with request

def downcase_username
  self.username = username.downcase
end

但是,我希望每次在视图中可见(读取?)时都标题用户名,而不是每次都指定user.username.titleize。我不知道在模型中调用哪个before_,在控制器中我会使用before_action。 此外,有没有办法自动化这个模型的所有值? (总是在视野中标题化)

任何提示都表示赞赏。

非常感谢

3 个答案:

答案 0 :(得分:2)

你可以制作一个自定义的吸气剂......

class User < ActiveRecord::Base
  def username
    self[:username].titleize
  end
end

如果你只想读取视图但不想读取编辑,那么你最好使用装饰器。

https://github.com/drapergem/draper

答案 1 :(得分:0)

我相信after_initialize方法可以帮到你。每次从数据库中获取对象时,都会调用所有after_initialize方法。

class User < ActiveRecord::Base
  after_initialize :titleize_username # in your case you'd wrap this in backticks

  def titleize_username
    self.username = username.titleize
  end
end

有关回调的详细信息,请查看Rails Guide on Callbacks

答案 2 :(得分:0)

Getter / Setter方法

@SteveTurczyn是对的 - 您需要自定义getter

基本上,每当您拨打model数据时,Rails基本上会使用一系列setter & getter methods来创建您看到的attributes。这基本上看起来像这样:

#app/models/user.rb
Class User < ActiveRecord::Base
   def attribute
       "value"
   end
end

getter方法基本上是实例方法,允许您在视图/控制器中调用Object.getter。这意味着如果您只想在视图中titleize,则可以在模型中使用getter来设置read对象setters设置属性


<强> CSS

另一个选择是使用CSS(text-transform: capitalize

这是处理前端styling选项的一种更有效的方法,就是使用CSS。您不必使用资源密集型ruby方法来解决简单的样式问题,而是在视图中更好地设置类,然后capitalizing

#app/assets/stylesheets/application.css.scss
.title_text {  text-transform: capitalize; }

#app/views/your_controller/index.html.erb
<%= content_tag :div, @user.example_content, class: "title_text" %>