2010-05-27 65 views
3

單獨創建於特定的控制器如何在軌跳過之前在軌

例如

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

我想這是獨此控制器上跳過,單單跳過特定的控制器before_create

 class FriendsController < ApplicationController 
      def new 
      end 
      def create 
      end 
    end 
+1

對我來說FriendsController的創建方法不應該是創建用戶,它應該創建現有用戶之間的關係 – ErsatzRyan 2010-05-27 14:31:23

回答

0

使用不調用回調的方法。 如save(false),update_attribute。

喜歡的東西下面

class FriendsController < ApplicationController 
     def new 
     end 
     def create 
     @user=User.new({:email => "[email protected]_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) 
+0

我使用的是創建方法,而不是新的方法可以建議你解決這個 – user351853 2010-05-27 11:42:04

+0

ref: - http:// api .rubyonrails.org/classes/ActiveRecord/Base.html#M001783創建方法如果驗證通過,則創建一個對象(或多個對象)並將其保存到數據庫。 – Salil 2010-05-27 12:00:11

+0

向'save'方法傳遞'false'不會執行模型驗證,但回調仍然會執行,無論如何。 – 2010-05-27 12:30:36

2

這是一個黑客,但你可以添加一個虛擬屬性賦給模型類,它只是作爲一個標誌來指示回調是否應該運行。然後控制器動作可以設置標誌。喜歡的東西:

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屬性的值。

+0

這工作得很好。也許這不是理想的,但它像一個魅力。 – 2012-08-14 05:42:06

0

不要用@ user.save(false)完全跳過驗證,除非這是您唯一驗證的是電子郵件地址。

你真的應該被這個邏輯移動與類似

before_create :validate_email, :if => :too_many_friends 

def too_many_friendships 
    self.friends.count > 10 
end 

你的模型是什麼邏輯或功能的不同也該控制器包含相比,你其他的呢?你可以發佈你不想讓它驗證的其他控制器,然後我們可以將它與這個進行比較。