2011-06-11 60 views
1

我目前正在開發一些模塊,以使用InheritedResources(最新版本)應用程序在Rails 3上從我的控制器中重用代碼。成功創建或更新對InheritedResources的操作後運行操作

我的想法是在成功創建或更新資源後應該運行一些行爲,但除了重新聲明「創建」或「更新」操作之外,我不確定如何解決此問題。

我目前使用類似

module SessionStorable 

    extend ActiveSupport::Concern 
    include Base 

    included do 
    before_filter :setup_resource, :only => :new 
    after_filter :reset_session_resource_id, :only => [:create, :update] 
    end 


    # .... 

end 

我有我使用特定資源設置,其中,除其他事項外,增加了資源的會話的ID。資源成功保存到BD後,我想從會話中刪除它的id,這就是after_filter所做的。

到目前爲止,我還通過將updated_at信息保存到會話中進行了處理,並比較了模型是否已更新(如果是,應該已成功)並運行該方法。但是,我不喜歡它(有點hacky),而且我正計劃讓其他模塊在更新之後也能與資源一起工作,並且不希望使用相同的方法兩次。

我應該使用IR的鉤子嗎?或者有關如何進行的其他想法?

+0

我在考慮使用HTTP狀態碼。就像只應用代碼,如果準備的請求是「200」或類似的,但不確定這種方法(或者它是否會工作) – Yaraher 2011-06-11 18:57:38

回答

3

我已經通過解決它條件。如果在創建或更新操作之後對象上沒有錯誤,則假定模型已正確保存應該是安全的,因此運行代碼將會很好。

+0

謝謝@Yaraher。 'object.valid?'也適用。 – scarver2 2015-08-20 19:22:52

2

也許你可以使用,而不是繼承爲基礎的方法:「object.errors.empty」

class BaseController < InheritedResources::Base 

before_filter :setup_resource, :only => :new 
after_filter :reset_session_resource_id, :only => [:create, :update] 

# ... 
end 

class YourController < BaseController 
# ... 
end 
+0

問題是,我們正在使用的行爲應該在其他應用程序之間共享。並且在此之上,即使資源沒有保存,after_filter仍然會被執行:(:(錯誤或缺失驗證等) – Yaraher 2011-06-12 19:55:15

+2

_「object.errors.empty?」條件。如果在創建或更新操作後,在對象上沒有任何錯誤,它應該是安全的假設,模型保存properly_ 只要我們有,比方說, 其中有很多成員的項目類假設你有一個表格對於您也可以爲其創建成員的項目(嵌套表單)。創建關聯成員時的錯誤將導致項目對象失效,但項目實例將爲方法errors.empty返回true。 – littlemove 2011-06-14 11:07:48

2

對不起,使用答案功能的評論,但因爲我不能在你的答案下做到這一點,我沒有看到其他選擇。

「object.errors.empty?」條件。如果在創建或更新操作後,在對象上沒有任何錯誤,它應該是安全的假設,該模型正確地保存

我覺得這並不總是正確的,讓我把你和示例:

class Project < ActiveRecord:Base 
    has_many :members 
    # ... 
end 

想象一下,您爲項目創建了一個表單,您還可以爲其創建成員(嵌套表單)。創建相關成員時的錯誤會使得項目對象無效,但是對於方法errors.empty,項目實例將返回true。

+0

似乎是一個有效的假設。由於需要這種行爲的控制器不受影響,並且不會使用嵌套表單,因此不會影響我們,但我會記下它並添加一些測試來記住這一點。謝謝! – Yaraher 2011-06-15 04:05:12

相關問題