在rails中单独使用特定控制器创建之前跳过

时间:2010-05-27 10:54:00

标签: ruby-on-rails

如何跳过在rails中单独使用特定控制器的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 个答案:

答案 0 :(得分:2)

这是一个hack,但你可以在模型类中添加一个虚拟属性,它只是作为一个标志来指示回调是否应该运行。然后控制器动作可以设置标志。类似的东西:

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

如果before_create回调的:unless选项可以直接引用虚拟属性的名称,我不确定。如果不能,则可以将其设置为模型中方法名称的符号,只需让该方法返回skip_validation属性的值即可。

答案 1 :(得分:0)

使用不调用回调的方法。 例如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)

答案 2 :(得分:0)

不要完全使用@ user.save(false)跳过验证,除非您验证的唯一内容是电子邮件地址。

您应该将此逻辑移动到您的模型中,例如

before_create :validate_email, :if => :too_many_friends

def too_many_friendships
  self.friends.count > 10
end

与其他控制器相比,此控制器包含哪些功能逻辑或差异?你可以发布你不想要验证的其他控制器,然后我们可以将它与这个比较。