我的模型中有一个字段用于创建日期,这不是从表单传递的,当前是在我的控制器的 create 方法中设置的。
这应该在我的模型中而不是在某种初始化方法中吗?如果是这样,该方法会是什么样子?
我还有其他字段要设置为默认值,每条记录都会创建,因此我试图找出可接受的标准放置位置。我开始认为它应该是模型,就好像模型曾经在控制器之外被调用过,它不会有所有这些逻辑。
我的模型中有一个字段用于创建日期,这不是从表单传递的,当前是在我的控制器的 create 方法中设置的。
这应该在我的模型中而不是在某种初始化方法中吗?如果是这样,该方法会是什么样子?
我还有其他字段要设置为默认值,每条记录都会创建,因此我试图找出可接受的标准放置位置。我开始认为它应该是模型,就好像模型曾经在控制器之外被调用过,它不会有所有这些逻辑。
我通常创建构建器,从不直接使用标准 Rails 方法create
。
关键是将所有逻辑与特定案例等集中在一个地方......
基本上在控制器中,我最终以这种方式调用构建器:
@my_model_instance = MyModelBuilder.new(current_user, params[:my_model]).build
@my_model_instance = MyModelBuilder.new(current_user, params[:my_model]).create
我所有的建筑商都住在/app/builders
这是一个非常基本的例子:
class MyModelBuilder
attr_accessor :params, :user, :my_model
# consider using a Struct if you keep a very basic initializer
def initialize(user, params)
self.user = user
self.params = params
end
def build
my_model
end
def create
my_model.tap{|m| m.save }
end
def my_model
@my_model ||= MyModel.new(default_values.merge(params))
end
def default_values
{
foo: 'bar'
}
end
end
Rails 已经管理了记录的创建和更新日期。
如果您的模型有一个created_at
字段或一个updated_at
字段,它们将填写模型的创建和更新时间。
您可以在迁移中轻松生成这些字段,例如:
create_table :hello do
t.timestamps
end
现在,对于默认值,您可以将它们填充到initialize
模型的方法中:
def initialize(*args)
self.field = default_value
super(*args)
end