我的问题类似于Build vs new in Rails 3。
在Rails 3中,我可以在视图中构建一个对象,通过cancan检查授权。
<% if can? :create, @question.answers.new %>
# Code...
<% end %>
在Rails 3中,.new
和.build
之间的区别在于.build
将新构建的对象添加到父集合中,然后在视图中生成了另一条记录,显然不是很理想。
但是,在Rails 4中,两者都将对象添加到集合中,在视图中呈现空记录。
有没有人就如何解决这个问题提出任何建议?检查视图中的记录是.persisted?
是一种选择,但我觉得我不应该这样做。
编辑:为了澄清,CanCan模型如下所示:
can :manage, Answer do |answer|
user.belongables.include?(answer.question.try(:belongable))
end
因此,我不能只按班级检查。实际上需要根据关系进行比较。
答案 0 :(得分: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
个实例。
答案 1 :(得分:2)
我可以解决问题并找到两种方法。
首先,正如https://github.com/rails/rails/issues/9167指出的那样,使用scoped
解决了这个问题。所以,我正在使用@question.answers.scoped.new
。正如我所解释的那样,一个简单的Answer.new(question: @question)
没有成功,因为需要更多数据,并且示例过于简单。
其次,坚持MVC模式。控制器负责准备数据。因此,在循环问题时,您可以在控制器中准备数据,例如@answers = @question.answers
。现在,@answers
集合不受关联中.new
或.build
的影响。