Как «заблокировать» запись от обновления или удаления? - PullRequest
4 голосов
/ 25 августа 2011

У меня есть модель User, которая автоматически генерирует Task.

Я хочу заблокировать эту задачу от редактирования или удаления.

Какие модификации моего контроллера мне нужно сделать? Есть ли элегантное решение, или мне нужно проверять каждый раз, когда происходит редактирование / уничтожение, если это задание?

Ответы [ 2 ]

4 голосов
/ 01 февраля 2012

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

class Thing < ActiveRecord::Base
  validate :locked_cannot_be_modified

  private

  def locked_cannot_be_modified
    errors.add(:base, "Entry is locked") if changes.any? && whatever_logic_makes_it_locked
  end
end

В качестве альтернативы, вы можете реализовать только для чтения? на модели:

class Thing < ActiveRecord::Base
  def readonly?
    whatever_logic_makes_it_locked || super
  end
end

этот подход вызовет исключение вместо ошибки проверки. Я думаю, это зависит от того, что вы пытаетесь сделать, какой подход лучше.

2 голосов
/ 25 августа 2011

Насколько я знаю, элегантного решения не существует, вам придется проверять каждый раз в контроллере, но это просто, определив этот метод в вашем контроллере:

def find_task
  @task = Task.find(params[:id])
  if @task.locked?
    flash[:error] = "This task is locked and cannot be altered at this stage."
    redirect_to tasks_path and return
  end
end

Тогда вы можетевызывайте этот метод как before_filter для тех действий, которые вас волнуют.При возврате nil (это то, что делает return), before_filter остановится и действие не будет выполнено.

...