我想创建一个名为' 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
答案 0 :(得分:0)
使用before_*
回调似乎非常惯用。或者,您也可以在控制器中创建一个服务对象(比如PersonaCreator
)来处理逻辑并在模型上设置适当的属性。
请注意,before_create
只会被调用一次,这意味着如果用户稍后更改了角色的名称,则不会调用回调。您可能希望执行before_save
之类的操作,并检查名称是否已更改。