在Rails 4中,构建与新建的区别

7
我的问题类似于 Rails 3 中的 Build vs new。 在 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
因此,我不能仅通过类来检查。实际的实例是根据关系进行比较所必需的。

1
if can? :create, Answer作为一个临时对象怎么样?(看起来你可以从这里传入类:https://github.com/ryanb/cancan/wiki/Checking-Abilities#checking-with-class) - GSP
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
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 集合中。

问题在于,与特定问题相关联的答案子集可能会受到限制,这需要一个实例来检查。 - pdu
也许包括你的CanCan权限定义会更有启发性? - GSP
非常感谢您的帮助,我现在已经解决了它,不幸的是并不是通过您的答案。但是我会给您点赞! - pdu

2
我能够解决这个问题并找到了两种方法。 第一种方法,如https://github.com/rails/rails/issues/9167所指出的那样,使用scoped可以解决这个问题。因此,我现在使用@question.answers.scoped.new。正如我所解释的,简单的Answer.new(question: @question)无法成功,因为需要更多的数据,而且示例过于简化。 第二种方法,保持MVC模式。控制器负责准备数据。所以,在循环遍历问题时,您需要在控制器中准备数据,例如@answers = @question.answers。现在,@answers集合不会受到关联上的.new.build的影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,