Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails `简单的"u形式"+;嵌套模型&x2B;CanCan:创建新的子更新父更新_Ruby On Rails_Ruby On Rails 3_Nested Forms_Cancan_Simple Form - Fatal编程技术网

Ruby on rails `简单的"u形式"+;嵌套模型&x2B;CanCan:创建新的子更新父更新

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中摸索了几个小时,试图找出如何判断正在更新的内容,到目前为止我还是一片空

环境:Rails 3.2.13+
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模型和视图,特别是表单对象模式。要实现的工作更多,但隔离令人耳目一新