创建模型

时间:2014-08-28 16:26:44

标签: ruby-on-rails

我想创建一个名为' Persona' (属于模型用户)。用户在表单中选择一个名称,然后单击“创建”按钮,因此我需要属性“名称”和“#39;在Persona模型中。我还希望Persona模型具有角色名称的小写版本,因此我需要第二个属性' downcase_name'。例如,用户可以选择角色的名字为Fooey Barman,因此downcase_name将是fooey barman。

我的问题是,如何初始化downcase_name属性?你把它放在Persona控制器中吗?在新的或创建方法?类似的东西:

def create
  @persona = Persona.new(persona_params)
  @persona.downcase_name = @persona.name.downcase
  if @persona.save
    flash[:success] = "Welcome, " + @persona.name
    redirect_to @persona
  else
    render 'new'
  end
end

或者你把它放在模型中?

class Persona < ActiveRecord::Base
  before_create :make_downcase_name
  validates :name, presence: true, length: { maximum: 50 }
  private
    def make_downcase_name
      self.downcase_name = name.downcase
    end
end

或者也许是这样的?

class Persona < ActiveRecord::Base
  validates :name, presence: true, length: { maximum: 50 }
  validates :downcase_name, presence: true
end

编辑:

所以,我是否正确地认为这样做的方法是在模型中,使用before_save和验证,就像这样?:

class Persona < ActiveRecord::Base
  before_save :make_downcase_name
  validates :name, presence: true, length: { maximum: 50 }
  validates :downcase_name, presence: true
  private
    def make_downcase_name
      self.downcase_name = name.downcase
    end
end

1 个答案:

答案 0 :(得分:0)

使用before_*回调似乎非常惯用。或者,您也可以在控制器中创建一个服务对象(比如PersonaCreator)来处理逻辑并在模型上设置适当的属性。

请注意,before_create只会被调用一次,这意味着如果用户稍后更改了角色的名称,则不会调用回调。您可能希望执行before_save之类的操作,并检查名称是否已更改。