如何跳过在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
答案 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
与其他控制器相比,此控制器包含哪些功能逻辑或差异?你可以发布你不想要验证的其他控制器,然后我们可以将它与这个比较。