Динамически устанавливаемый метод для before_save - PullRequest
0 голосов
/ 20 июля 2010

В моем контроллере я хочу динамически привязать мой метод экземпляра к обратным вызовам before_save.

Есть ли способы, которыми мы можем динамически привязывать методы к обратному вызову со стороны контроллера ....

РЕДАКТИРОВАТЬ:

Контроллер

Этот оригинальный код ..

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

Если условие истинно, то я хочу установить пользовательский обратный вызов, который будет выполнять точный вызов после 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 Ответ

2 голосов
/ 20 июля 2010

Я думаю, вы ищете что-то вроде следующего.В модели:

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

Или что-товдоль этих линий.Другими словами, используйте модель для удержания состояния и передачи логики

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...