2013-07-24 40 views
7

我的問題類似於Build vs new in Rails 3構建與新的Rails 4

在Rails 3中,我可以在視圖中構建一個對象來通過cancan檢查授權。

<% if can? :create, @question.answers.new %> 
    # Code... 
<% end %> 

在Rails 3,.new.build之間的區別是.build添加新建成的對象父集合,然後導致的觀點,這顯然是不希望額外的記錄。

但是,在Rails 4中,它們都將對象添加到集合中,從而在視圖中呈現空記錄。

有沒有人有任何建議如何解決這個問題?檢查一個記錄是否是.persisted?在視圖中是一個選項,但不知何故,我覺得我不應該這樣做。

編輯:爲了澄清,該康康舞模型是這樣的:

can :manage, Answer do |answer| 
    user.belongables.include?(answer.question.try(:belongable)) 
end 

正因爲如此,我不能只按類進行檢查。實際需要根據關係進行比較。

+1

'如果可以? :創建,答案作爲丟棄對象? (看起來你可以從這裏通過該類:https://github.com/ryanb/cancan/wiki/Checking-Abilities#checking-with-class) – GSP

回答

2

我可以解決這個問題,並找出兩種方法。

首先,如https://github.com/rails/rails/issues/9167指出,使用scoped解決了這個問題。所以,我正在使用@question.answers.scoped.new。正如我所解釋的,一個簡單的Answer.new(question: @question)沒有成功,因爲需要更多的數據,並且這個例子被過分簡化了。

其次,堅持到MVC模式。控制器負責準備數據。因此,在循環問題時,您需要在控制器中準備數據,如@answers = @question.answers。現在,@answers集合不受關聯上的.new.build的影響。

4

我在CanCan上沒有完全更新,但除非創建的能力與CanCan中的特定@question實例相關,否則您可以直接查看對該類的授權。您的視圖中不需要構建任何實例並且沒有無關的對象。

<% if can? :create, Answer %> 
    # Code.. 
<% end %> 

https://github.com/ryanb/cancan/wiki/Checking-Abilities#checking-with-class

編輯:

基於編輯,嘗試建立與聯想到你需要的問題,一個獨立的答案。

<% if can? :create, Answer.new(question: @question) %> 
    # Code.. 
<% end %> 

這不應該,至少,一個Answer實例添加到您的收藏@question.answers

+0

問題是限制可能適用於答案綁定的子集到那個恕我直言需要實例檢查的具體問題。 – pduersteler

+0

也許包括你的CanCan能力定義可能會提供更多見解? – GSP

+0

更新的問題。 – pduersteler