`Simple_form` +嵌套模型+ CanCan:创建新的子更新父

时间:2013-06-14 18:06:16

标签: ruby-on-rails ruby-on-rails-3 nested-forms cancan simple-form

环境:Rails 3.2.13 + simple_form 2.1.0 + CanCan 1.6.10 +等。

模型缩略图:Article有作者(User s)和Comment s。 CommentArticle中的嵌套资源。 Comment模型包括内容,评论者(当前登录的用户ID)和文章ID。

问题:在Comment上创建新的Article会导致更新Article,这是可以理解的。目前,CanCan的Ability类是硬连线的,允许该用户更新Article。我想将此限制为允许在Article的{​​{1}} s - 和该字段 - 更新时允许更新。我一直在Comment探索几个小时,试图找出如何判断更新的内容,并且到目前为止一直是空白。

模型发布在this Gist以回应Michael Szyndel的问题。

帮助?

1 个答案:

答案 0 :(得分:1)

代替识别罪魁祸首,我认为与依赖 accepts_nested_attributes_for有关,我宁愿提供解决方案 - 实施before_update回调在Article模型上。

before_update :verify_update_authorization

# virtual attribute to supply CanCan a user candidate
def initiator
  @initiating_user if @initiating_user
end

def initiator=(user)
  @initiating_user = user
end

private

  def verify_update_authorization
    return false if Ability.new(initiator).cannot?(:update, self)
  end

然后,当需要更新时,控制器需要设置Article的虚拟属性。 在这种特殊情况下,覆盖InheretedResources更新操作是合适的。