Пропуск перед созданием на конкретном контроллере в одиночку в рельсах - PullRequest
3 голосов
/ 27 мая 2010

Как пропустить before_create для отдельного контроллера в рельсах

пример

     class User < ActiveRecord::Base
        before_create :validate_email
        def validate_email
            ----
        end
     end

Я хочу, чтобы это пропускалось только на этом контроллере,

     class FriendsController < ApplicationController
          def new
          end
          def create
          end
     end

Ответы [ 3 ]

2 голосов
/ 27 мая 2010

Это хак, но вы можете добавить виртуальный атрибут к классу модели, который просто действует как флаг, чтобы указать, должен ли выполняться обратный вызов или нет. Затем действие контроллера может установить флаг. Что-то вроде:

class User < ActiveRecord::Base   
  before_create :validate_email, :unless => :skip_validation
  attr_accessor :skip_validation 

  def validate_email 
    ...
  end 
end 

class FriendsController < ApplicationController          
  def create          
    @user = User.find # etc...
    @user.skip_validation = true
    @user.save
  end          
end

Я не совсем уверен, что опция :unless обратного вызова before_create может напрямую ссылаться на имя виртуального атрибута. Если это невозможно, вы можете установить для него символ, который является именем метода в вашей модели, и просто заставить этот метод возвращать значение атрибута skip_validation.

0 голосов
/ 03 июня 2010

Не пропускайте проверку полностью с помощью @ user.save (false), если только вы проверяете только адрес электронной почты.

Вы действительно должны перенести эту логику в вашу модель с чем-то вроде

before_create :validate_email, :if => :too_many_friends

def too_many_friendships
  self.friends.count > 10
end

Какую логику или разницу в функциональности содержит этот контроллер по сравнению с другими? Можете ли вы опубликовать другие контроллеры, на которых вы не хотите, чтобы они проверялись, и тогда мы сможем сравнить их с этим.

0 голосов
/ 27 мая 2010

Используйте метод, который не вызывает обратные вызовы. такие как save (false), update_attribute.

Что-то вроде следующего

 class FriendsController < ApplicationController
      def new
      end
      def create
        @user=User.new({:email => "some_email@some_domail.com" })
        @user.save(false)  @this will skip the method "validate_email"
      end
 end

EDITED

Попробуйте это

 class User < ActiveRecord::Base
    def validate
        ----
    end
 end

&

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