【问题标题】:`Simple_form` + nested model + CanCan: creating new child updates parent`Simple_form` + 嵌套模型 + CanCan:创建新子更新父
【发布时间】:2013-06-14 18:06:16
【问题描述】:

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

模型缩略图:Articles 有作者 (Users) 和 Comments。 Comments 是Articles 内的嵌套资源。 Comment 模型包括内容、评论者(当前登录的用户 ID)和文章 ID。

问题:在 Article 上创建新的 Comment 会导致 Article 更新,这是可以理解的。目前,CanCan 的Ability 类是硬连线的,允许该用户更新Article。如果ArticleComments(以及该字段)被更新,我想将其限制为允许更新。我已经在pry 中闲逛了几个小时,试图弄清楚如何判断正在更新的内容,但到目前为止我一直在画一个空白。

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

帮助?

【问题讨论】:

  • 在评论创建上更新的文章是无法理解的,除非你有计数器缓存。你能包括你的模型协会吗?
  • 您的问题不清楚。您是否无法控制关联的自动保存回调并且无法检测到非持久性修改?
  • @crftr,我有(至少)两个相互交织的问题: 1. 我想使用 CanCan 的能力类将文章内容的更新限制为文章的作者,同时允许任何登录用户在该文章上创建 cmets 2。我想了解在 CanCan 中实现该效果是否最实用,或者我是否应该在我的InheritedResources::Base-派生控制器中做一些不同的事情。

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


【解决方案1】:

代替确定罪魁祸首,我猜这与对accepts_nested_attributes_for 的依赖有关,我宁愿提供一个解决方案——在@987654325 上实现before_update 回调@模型。

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

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

【讨论】:

  • 这是使整个事情顺利进行所需要做的三件事之一,鉴于我一直在走的轨道,我不太可能在可生存的时间范围内自己解决这个问题。其他事情是每当我创建一个新的 Article 对象时记得调用article.comments.build,并且需要通过创建或编辑评论视图的异常时髦的旋转。最后一个,从 StackOverflow 流量来看,显然对许多其他人来说同样晦涩难懂,这促使我研究 ActionView 模板替换,例如 Erector
  • 如果我可以主动向您提供意见,
  • 似乎持久性和用户交互问题变得紧密耦合。我认为这是一种代码味道。我的建议是将用户交互操作卸载到完全不同的控制器、非 ActiveRecord 模型和视图。 blog.codeclimate.com/blog/2012/10/17/…,特别是表单对象模式。实现的工作量更大,但隔离令人耳目一新。
  • 非常同意当前架构需要对多个链锯进行外科手术应用,特别是持久性和域逻辑的解耦。鉴于我们主要项目的中期未来可交付成果是功能齐全的 REST/JSON API,尤其是考虑到我们希望在它成为失败鲸鱼级问题之前获得可扩展性,这里有很多事情需要考虑.我们的商业计划要求拥有四分之一的开发团队只会让事情变得更“有趣”。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2021-10-02
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多