Rails强参数增量添加

时间:2013-07-17 16:55:55

标签: ruby-on-rails ruby-on-rails-4 strong-parameters

有谁知道,如果使用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)吗?

3 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:0)

这是一个有趣的问题。我不确定,但在这种情况下我的直觉反应就是测试它。无论是否休息,你都会得到答案。

答案 2 :(得分: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