Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.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 覆盖can';不分配大规模保护属性_Ruby On Rails_Ruby_Activeadmin - Fatal编程技术网

Ruby on rails 覆盖can';不分配大规模保护属性

Ruby on rails 覆盖can';不分配大规模保护属性,ruby-on-rails,ruby,activeadmin,Ruby On Rails,Ruby,Activeadmin,我有一些任何人都不应该访问的字段,所以我不能只是将这些字段添加到attr_accessible中。但我也有积极的管理,应该有权访问这些领域。到目前为止,我尝试了下一步: controller do def update org = Organization.find_by_id(params[:id]) org.subscription.plan_id = params[:organization][:subscription_attributes][:plan_id]

我有一些任何人都不应该访问的字段,所以我不能只是将这些字段添加到attr_accessible中。但我也有积极的管理,应该有权访问这些领域。到目前为止,我尝试了下一步:

controller do
  def update
    org = Organization.find_by_id(params[:id])
    org.subscription.plan_id = params[:organization][:subscription_attributes][:plan_id]
    org.subscription.expires_at = params[:organization][:subscription_attributes][:expires_at]
    org.save
    super
  end
end

但是
super
仍然在所有参数上调用update属性,而不仅仅是那些被更改的参数。如何排除要在super中更新的字段?

我建议对rails 3使用强参数gem

验证是否必须在模型级或控制器级运行一直是一个相当大的讨论

通过使用强参数,您可以在控制器操作中轻松设置允许的参数:

params.permit(:name, {:emails => []}, :friends => [ :name, { :family => [ :name ], :hobbies => [] }])

同样在Rails 4中,这将成为默认值。

根据active admin的来源,我调用了一个超级方法上的block,并在那里传递所需的参数。 结果代码如下所示

def update
      plan_id = params[:organization][:subscription_attributes].delete(:plan_id)
      expires_at = params[:organization][:subscription_attributes].delete(:expires_at)
      update! do
          resource.subscription.plan_id = plan_id
          resource.subscription.expires_at  = expires_at
          resource.subscription.save if resource.valid?
      end
    end

我不确定您到底想做什么,但如果您想从params散列中删除特定属性,则可以使用
delete
删除has中的键值对。因此,如果您想从参数中删除
plan\u id
,您可以通过
params[:organization][:subscription\u attributes]来完成。删除(:plan\u id)
。我可以,但如果出现问题(验证失败),我将无法再访问这些数据,直到重新刷新为止。。但如果您将它们保存在某个变量中,然后将它们放回失败状态。e、 g.
plan\u id=params[:organization][:subscription\u attributes]。删除(:plan\u id)
,然后在失败的情况下将其合并回来,如
params[:organization][:subscription\u attributes][:plan\u id]=plan\u id
,这也不起作用,因为当您调用super时,该方法将参数存储到变量中。但当我试图用所需的参数覆盖它时,我仍然无法捕获它。我不确定你在super中有什么!