2

有谁知道,如果使用 strong_parameters gem,我们可以逐步添加如下属性:

def user_params
  params[:user].permit(:name, :email)

  if current_user.admin?
    params[:user].permit(:is_admin)
  end
end

:is_admin在这里,如果当前用户是管理员,我将逐步要求代码允许参数。它不应该只是添加到先前允许的参数列表(:name:email)吗?

4

3 回答 3

1

他们这样做的方式是将我所有的参数放在一个类中,就像强参数 railscast 一样。

这样我就有了这样的东西

 class PermittedParams < Struct.new(:params,:admin)

   def administrator_attributes
       allowed = [:email, :name, :password, :password_confirmation, :password_digest]
    if admin.has_any_role? :realm_admin, :system_admin
      allowed << :active << :roles
    end
    allowed
   end

   .... other models .... 



   def method_missing(method,*args,&block)
    attributes_name = method.to_s + '_attributes'
    if respond_to? attributes_name, false
      params.require(method).send(:permit, *method(attributes_name).call)
    else
      super
    end
  end
 end

然后在控制器中调用@administrator.update_attributes(permitted_params.administrator)

因为它只是一个数组,您可以构建数组,然后只需使用 * 将其传递给许可。

于 2013-08-09T03:11:03.983 回答
0

这是一个有趣的问题。我不确定,但我在这种情况下的直觉反应只是测试一下。不管它坏与否,你都会有你的答案。

于 2013-07-20T14:52:01.660 回答
0

我有一个带有到期日期参数的用户模型,我希望只有管理员才能设置该参数。没有办法将参数增量添加到许可列表中......所以你必须打破 DRY 并这样做......

if can? :manage, :all
   params.require(:user).permit(:first_name, :last_name, :email, :expiration_date)
else
   params.require(:user).permit(:first_name, :last_name, :email)
end
于 2013-08-09T02:59:45.540 回答