在Rails 4中构建vs新

时间:2013-07-24 10:49:55

标签: activerecord ruby-on-rails-4

我的问题类似于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

因此,我不能只按班级检查。实际上需要根据关系进行比较。

2 个答案:

答案 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的影响。