在before_save上动态设置方法

时间:2010-07-19 21:06:22

标签: ruby-on-rails ruby callback

在我的控制器中,我想将我的实例方法动态绑定到before_save回调。

我们有什么方法可以动态地将方法绑定到来自控制器端的回调....

编辑:

控制器

这个原始代码..

def amfupdate
  set_properties
  validate_record  if params[:csv_header][:validate_record] == "Y" #On this condition...
  super
end

如果condition为true,我想设置自定义回调,该回调将在before_save之后但在保存对象之前完成调用。

我想在before_save之后完全调用这个方法..但是如果在控制器端条件为真..

在模型中

def validate_record
  self.csv_columns.each do |csv_column|
    self.errors.add_to_base(_("Invalid column name #{csv_column.column_name}.")) \
      unless self.model_name.constantize.column_names.include?(csv_column.column_name)
  end
end

1 个答案:

答案 0 :(得分:2)

我认为您正在寻找以下内容。在模型中:

validate do |instance|
  instance.csv_columns.each do |csv_column|
    instance.errors.add :csv_columns, "Invalid column name #{csv_column.column_name}"
      unless instance.class.column_names.include?(csv_column.column_name)
  end
end

这将在保存记录之前调用,如果将错误添加到

,将中止保存

更新:建议进行条件验证

向模型添加属性

attr_accessor :some_condtional

在控制器中设置

@instance.some_conditional = true # or false

然后验证现在看起来像这样:

validate do |instance|
  instance.csv_columns.each do |csv_column|
    instance.errors.add :csv_columns, "Invalid column name #{csv_column.column_name}"
      unless instance.class.column_names.include?(csv_column.column_name)
  end if instance.some_conditional
end

或者那些东西。换句话说,使用模型来保持状态并传达逻辑