7

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

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

<% if can? :create, @question.answers.new %>
  # Code...
<% end %>

.new在 Rails 3 中,和之间的区别在于.build.build新构建的对象添加到父集合中,然后在视图中产生了额外的记录,这显然是不希望的。

然而,在 Rails 4 中,两者都将对象添加到集合中,从而在视图中呈现空记录。

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

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

can :manage, Answer do |answer|
  user.belongables.include?(answer.question.try(:belongable))
end

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

4

2 回答 2

4

我对 CanCan 的了解并不完全最新,但除非创建能力与@questionCanCan 中的特定实例相关联,否则您似乎可以直接针对该类检查授权。无需构建实例,您的视图中也没有无关的对象。

<% 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集合中。

于 2013-07-24T12:57:33.527 回答
2

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

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

第二,坚持MVC模式。控制器负责准备数据。因此,在循环问题时,您需要在控制器中准备数据,例如@answers = @question.answers. 现在,该@answers系列不受该协会.new.build协会的影响。

于 2013-07-30T08:38:43.270 回答