Ruby on rails `简单的"u形式"+;嵌套模型&x2B;CanCan:创建新的子更新父更新
环境:Rails 3.2.13+Ruby on rails `简单的"u形式"+;嵌套模型&x2B;CanCan:创建新的子更新父更新,ruby-on-rails,ruby-on-rails-3,nested-forms,cancan,simple-form,Ruby On Rails,Ruby On Rails 3,Nested Forms,Cancan,Simple Form,环境:Rails 3.2.13+simple\u form2.1.0+CanCan 1.6.10+等 模型缩略图:文章s有作者(用户s)和评论s注释s是文章s中的嵌套资源。Comment模型包括内容、评论者(当前登录的用户ID)和文章ID 问题:在文章上创建新的注释会导致更新文章,这是可以理解的。目前,CanCan的能力类是硬连接的,允许该用户更新文章。我想将其限制为允许更新文章的评论s,并且只允许更新该字段。我已经在pry中摸索了几个小时,试图找出如何判断正在更新的内容,到目前为止我还是一片空
simple\u form
2.1.0+CanCan 1.6.10+等
模型缩略图:文章
s有作者(用户
s)和评论
s<代码>注释s是文章
s中的嵌套资源。Comment
模型包括内容、评论者(当前登录的用户ID)和文章ID
问题:在文章
上创建新的注释
会导致更新文章
,这是可以理解的。目前,CanCan的能力
类是硬连接的,允许该用户更新文章
。我想将其限制为允许更新文章
的评论
s,并且只允许更新该字段。我已经在pry
中摸索了几个小时,试图找出如何判断正在更新的内容,到目前为止我还是一片空白
模型发布在回应迈克尔·辛德尔的问题上
帮助?我想这与依赖<代码>接受<代码>的嵌套属性有关,而不是识别罪魁祸首,我更愿意提供一个解决方案--在<代码>文章代码>模型上实现一个<代码>更新之前<代码>回调
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
当需要更新时,控制器需要设置文章的虚拟属性。在这种特殊情况下,应该覆盖InheredResources更新操作。而不是识别罪魁祸首,我猜这与对
的依赖有关,我宁愿提供一个解决方案——在文章
模型上的更新之前实现回调
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
当需要更新时,控制器需要设置文章的虚拟属性。在这种特殊情况下,可以覆盖InheredResources更新操作。除非您有计数器缓存,否则在创建评论时更新的文章是不可理解的。你能包括你的模型协会吗?你的问题不清楚。您是否在控制关联的autosave回调和检测非持久性修改时遇到问题?@crftr,我(至少)遇到两个相互交织的问题:1。我想使用CanCan的Capability类将文章内容的更新仅限于文章作者,同时允许任何登录用户对该文章2创建评论。我想了解在CanCan中实现这种效果是否最实际,或者我是否应该在我的InheritedResources::Base
-派生控制器中做一些不同的事情。除非您有计数器缓存,否则在创建注释时更新的文章是不可理解的。你能包括你的模型协会吗?你的问题不清楚。您是否在控制关联的autosave回调和检测非持久性修改时遇到问题?@crftr,我(至少)遇到两个相互交织的问题:1。我想使用CanCan的Capability类将文章内容的更新仅限于文章作者,同时允许任何登录用户对该文章2创建评论。我想了解在CanCan实现这种效果是否最实际,或者我是否应该在我的InheritedResources::Base
-派生控制器中做些不同的事情。这是使整个过程正常运行所需要做的三件事之一,考虑到我所走的路线,我不太可能在一个可生存的时间框架内独自解决这个问题。其他的事情是,每当我创建一个新的article对象时,记得调用article.comments.build
,以及创建或编辑注释视图需要经历的异常古怪的旋转。从StackOverflow流量来看,最后这一点显然对其他许多人来说都是模糊的,这促使我研究ActionView模板的替换,例如。如果我能提供您一个未经请求的意见,那么持久性和用户交互问题似乎正变得紧密耦合。我认为这是一种代码气味。我的建议是将用户交互操作转移到完全不同的控制器、非ActiveRecord模型和视图,特别是表单对象模式。实现起来还有很多工作要做,但是隔离是令人耳目一新的。我们非常同意当前的体系结构需要外科手术般地应用几个链锯,特别是持久性和域逻辑的解耦。考虑到我们主要项目的中期未来可交付成果是一个功能齐全的REST/JSON API,特别是考虑到我们希望在可伸缩性成为fail whale类问题之前将其固定下来,这里有很多需要考虑的问题。我们的业务计划要求开发团队中有四分之一的成员,这只会让事情变得更“有趣”。再次感谢!这是使整件事顺利进行所需要做的三件事之一,考虑到我所走的道路,我不可能在一个可生存的时间框架内独自解决这个问题。其他的事情是,每当我创建一个新的article对象时,记得调用article.comments.build
,以及创建或编辑注释视图需要经历的异常古怪的旋转。从StackOverflow流量来看,最后这一点显然对其他许多人来说都是模糊的,这促使我研究ActionView模板的替换,例如。如果我能提供您一个未经请求的意见,那么持久性和用户交互问题似乎正变得紧密耦合。我认为这是一种代码气味。我的建议是将用户交互操作转移到完全不同的控制器、非ActiveRecord模型和视图,特别是表单对象模式。要实现的工作更多,但隔离令人耳目一新