Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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
Parameters Rails 4中多态模型的禁止属性错误_Parameters_Ruby On Rails 4_Cancan_Mass Assignment_Polymorphism - Fatal编程技术网

Parameters Rails 4中多态模型的禁止属性错误

Parameters Rails 4中多态模型的禁止属性错误,parameters,ruby-on-rails-4,cancan,mass-assignment,polymorphism,Parameters,Ruby On Rails 4,Cancan,Mass Assignment,Polymorphism,Rails 4提供了强大的_参数,这是一个很好的补充,但我遇到了一个问题。我有一个多态模型Comment,我一辈子都不能让控制器接受它需要的参数。以下是我的代码(为清晰起见,请缩短): 路线: resources:articles-do 资源:评论 结束 型号: 类文章:可评论 结束 类注释true 结束 控制器: skip_before_filter :can_can_can class CommentsController“谢谢!” 其他的 渲染:新 结束 结束 私有的 def get

Rails 4提供了强大的_参数,这是一个很好的补充,但我遇到了一个问题。我有一个多态模型
Comment
,我一辈子都不能让控制器接受它需要的参数。以下是我的代码(为清晰起见,请缩短):

路线:

resources:articles-do
资源:评论
结束
型号:

类文章:可评论
结束
类注释true
结束
控制器:

skip_before_filter :can_can_can
class CommentsController“谢谢!”
其他的
渲染:新
结束
结束
私有的
def get_可评论
资源,id=request.path.split(“/”[1,2]
@commentable=resource.singularize.classify.constantize.find(id)
将_重定向到:主页,除非已定义?(@commentable)
结束
def注释参数
参数require(:comment).permit(:title,:message)
结束
结束
发布参数(来自文章#show上的表单):

{“真实性令牌”=>“v70nN8aFpofNw9vbVjhpsm9SwLOwKlOpNOEOTozUwCk=“,
“注释”=>{“标题”=>“测试”,“消息”=>“测试”},
“article_id”=>“1”}
在我看来,它应该可以工作,但无论我尝试什么,我都会在CommentsController中获得
ActiveModel::禁止属性错误#create
——即使我尝试了

def comment_参数
许可证!
结束

在控制器中。我的其他(非多态性)模型没有这样的问题,这就是为什么我怀疑它与多态性有关。有什么想法吗

因为缺少答案似乎表明我找错了方向。问题不在于强_参数,而在于我用于执行基于角色和操作的授权的CanCan gem。显然,这与CanCan如何将参数分配给对象有关(CanCan接管默认的ActionController方法)-具体请参见中的详细信息。简而言之,将其放在我的应用程序控制器中可以解决以下问题:

before_filter do
  resource = controller_name.singularize.to_sym
  method = "#{resource}_params"
  params[resource] &&= send(method) if respond_to?(method, true)
end
更新:

正如@scaryguy所指出的,如果上面的方法是从一个没有关联模型的控制器中调用的,那么它将失败。解决方案是简单地命名该方法并将其称为before_过滤器,同时在那些没有模型的控制器中明确排除它(因此无论如何也不会从CanCan的自动能力分配中受益)。我估计是这样的:

before_filter :can_can_can

def can_can_can
  resource = controller_name.singularize.to_sym
  method = "#{resource}_params"
  params[resource] &&= send(method) if respond_to?(method, true)
end
然后在无模型控制器中:

skip_before_filter :can_can_can

实际上,这似乎是CanCan造成的一个错误,我使用它来执行基于角色的授权-禁用它可以创建注释。嗯,这和我遇到的问题完全一样,这个解决方案非常有效。我敢打赌,随着时间的推移,会有更多的人遇到这个问题。谢谢@Ecnalyr,很高兴听到这对某人有帮助!是的,它可以工作,但只有当控制器和模型存在并且两者都被正确命名时。当您想要使用没有模型的控制器时,这会破坏一切。