2012-08-29 37 views
0

我的背景

I am /是一個PHP開發者。已經有15年了。 Ruby對我來說是新的(我的新挑戰)!設計與相關記錄驗證

當前設置

我正在使用Devise和用戶模型。
的Rails 3.2.1
設計:2.1.2

使用案例

當用戶註冊(打算直通設計控制器),我要創建的用戶記錄,但也富自動記錄。我創建了一個處理創建Foo記錄的after_create。

Class User < ActiveRecord::Base 

    after_create :make_foo 

    def make_foo 
    Foo.create(
     :name => name, 
     :user_id => id 
    ) 
    end 

end 

Class Foo < ActiveRecord::Base 

    belongs_to :user 

end 

症狀

我在那裏沒有被創建富記錄時出現問題(例如驗證),那麼用戶記錄仍然創造了(我不希望出現這種情況)。我在after_create中添加了一個Raise Exception,它回滾了用戶創建。
但是,我寧願一些不錯的錯誤處理,而不是拋出異常。現在,我得到一個500錯誤頁面與該例外。 我希望表單可以再次顯示失敗的原因。

Class User < ActiveRecord::Base 

    after_create :make_foo 

    def make_foo 
    foo = Foo.create(
     :name => name, 
     :user_id => id 
    ) 
    if !foo.valid? 
     raise Exception.new('Foo creation failed.') 
    end 
    end 

end 

請求幫助

有什麼建議?

回答

0

我結束了一個異常,你可以像這樣

flash[:error] = 'error msg' 

if !foo.valid? 

塊設置flash消息回到同一頁面重定向和重定向覆蓋Devise Resitrations Controller,並開始......救援......結束insi創建方法。

# routes.rb 
devise_for :users, :controllers => { :registrations => "my_devise/registrations" } 

# app/controllers/my_devise/registrations_controller.rb 
class MyDevise::RegistrationsController < Devise::RegistrationsController 
    def create 
    begin 
     super 
    rescue Exception 
     self.resource.errors[:base] << "My error message here" 
     clean_up_passwords resource 
     respond_with resource 
    end 
    end 
end 
0

反而提高了使用

session[:return_to] = request.referer 
redirect_to session[:return_to] 
+0

感謝您花時間回答。也許它不清楚,但創建Foo記錄的代碼不在控制器中,而是在Model中。在模型中放置Session和重定向以及Flash邏輯並不好。它通常在控制器內部。控制器不是我的,而是Devise的控制器。我希望這有助於澄清我的情況。 – roychri

0

您可能想看看Rails3: Devise User has_one relationship以查看更好的建模是否可以使問題更容易。

你現在正在建模user.rb的方式,的確使得用戶可以存在無美孚(其中必須屬於但是用戶),所以它只是調用:make_fooafter_create回調沒有其他無論如何保證。

+0

看起來很有希望。但在我的情況下,我的Foo(團隊)是多態的,因爲Foo可以屬於除用戶記錄之外的其他東西。這意味着我不確定這適用於我的情況,但我會看。謝謝, – roychri