Изменение запуска Rails Validations в зависимости от текущего пользователя в глубоко вложенной форме - PullRequest
0 голосов
/ 05 августа 2010

Я работаю с вложенной формой, которая включает в себя в общей сложности 7 моделей, каждая из которых имеет разные проверки. При простом редактировании формы проверки выполняются и отображаются нормально, а данные сохраняются правильно. Однако мне нужно запустить разные проверки в зависимости от того, кто отправляет форму (т. Е. Администраторы могут пропустить некоторые другие обязательные поля).

Я думал, что смогу пропустить определенные проверки, используя attr_accessible: edit_user в моих моделях, а затем установить это в контроллере.

class ModelExample < ActiveRecord::Base
  attr_accessible :editing_user
  validates_presence_of :email, :unless => "editing_user == 'admin'"
end

class ModelExamplesController < ActionController::Base
  def create
    @model_example = ModelExample.new(params[:model_example])
    @model_example.editing_user = 'admin'
    @model_example.save
  end
end

Я использовал эту базовую структуру во вложенных моделях, проверяя, могу ли я сохранить правильно. Вот тут и начинается странное поведение. По некоторым причинам, похоже, что ActiveRecord пытается сохранить вложенные модели несколько раз, каждый раз выполняя проверки. Что делает это странным, так это то, что я называю @ model_example.save, который должен просто вернуть false, если это не удастся. Но первая проверка проходит (так как редактирование_пользователя установлено), но последующие проверки завершаются неудачно и вызывают исключения, поэтому обычные методы .save в конечном итоге вызывают исключение, а не возвращают.

Кто-нибудь знает, как избежать того, чтобы ActiveRecord выполнял все дополнительные проверки и сохранения, или как сохранить edit_user во всех этих повторяющихся действиях?

1 Ответ

1 голос
/ 05 августа 2010

ха!только что сделал этот день, ну, в любом случае, почти тот же вариант использования (сохраняйте пользователя).Вот как я решил это (со всей благодарностью моему другу Джейсону Дью, с которого я скопировал):

class User < ActiveRecord::Base

  module ClassMethods
    attr_accessor :current
  end

  extend ClassMethods
end

Этот блок кода добавляет одноэлементный метод доступа: текущий к методам класса User и может быть вызван какUser.current.приятнее выглядит метод с именем self.currrent

, затем в контроллере приложения

before_filter :require_user #=> which in this case goes off and sets the current_user var
before_filter {|c| User.current = current_user}

, который передает контроллер приложения в блок и устанавливает переменную User.current.

Тогда в любой другой модели

class MyClass < ActiveRecord::Base
  def log
    "This was done by #{User.current}"
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...