覆盖无法分配受质量保护的属性

时间:2013-02-21 09:04:08

标签: 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]
    org.subscription.expires_at = params[:organization][:subscription_attributes][:expires_at]
    org.save
    super
  end
end

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

2 个答案:

答案 0 :(得分:0)

我建议使用strong_parameters gem作为rails 3。

无论是否必须在模型或控制器级别运行验证,这一直是一个很大的错误。

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

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

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

答案 1 :(得分:0)

根据活动管理员的来源,我在超级方法上调用了一个块,并在那里传递了所需的参数。 结果代码看起来像这样

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