Ruby on rails 覆盖can';不分配大规模保护属性
我有一些任何人都不应该访问的字段,所以我不能只是将这些字段添加到attr_accessible中。但我也有积极的管理,应该有权访问这些领域。到目前为止,我尝试了下一步: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]
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中有什么!