在我的控制器中,我想将我的实例方法动态绑定到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
答案 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
或者那些东西。换句话说,使用模型来保持状态并传达逻辑