繁体   English   中英

Ruby on Rails:如何在模型中创建初始化方法,还是应该在控制器中设置所有默认参数?

[英]Ruby on Rails: how do I create an initializer method in the model or should I set all the default params in a controller?

我的模型中有一个用于创建日期的字段,该字段未从表单传递,并且当前在控制器的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM