2013-07-24 41 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