在Rails 4中构建vs新

pdu*_*ler 7 activerecord ruby-on-rails-4

我的问题类似于Rails 3中的Build vs new.

在Rails 3中,我可以在视图中构建一个对象,以通过cancan检查授权.

<% if can? :create, @question.answers.new %>
  # Code...
<% end %>
Run Code Online (Sandbox Code Playgroud)

在Rails 3,之间的区别.new,并.build.build增加了新建成的对象父集合,然后导致的观点,这显然是不希望额外的记录.

但是,在Rails 4中,两者都将对象添加到集合中,在视图中呈现空记录.

有没有人建议如何解决这个问题?检查记录是否.persisted?在视图中是一个选项但不知何故我觉得我不应该这样做.

编辑:为了澄清,CanCan模型如下所示:

can :manage, Answer do |answer|
  user.belongables.include?(answer.question.try(:belongable))
end
Run Code Online (Sandbox Code Playgroud)

因此,我不能只按班级检查.实际上需要一个实际的实例来根据关系进行比较.

pdu*_*ler 2

我可以解决这个问题并找到了两种方法。

首先,正如https://github.com/rails/rails/issues/9167指出的那样,使用scoped解决了这个问题。所以,我改为使用@question.answers.scoped.new. 正如我所解释的,简单的方法Answer.new(question: @question)并没有成功,因为需要更多的数据,而且示例过于简单。

其次,坚持MVC模式。控制器负责准备数据。因此,在循环问题时,您可以在控制器中准备数据,例如@answers = @question.answers. 现在,该@answers藏品不再受到该协会的影响.new,也不.build再受该协会的影响。