Rails允许some_params因用户而异

时间:2019-06-08 07:29:40

标签: ruby-on-rails

在Rails项目中,我有一个带有“状态”列/属性的模型

不同的用户可以设置不同的状态值。 例如

  • 未登录,您可以创建新记录,并且状态应始终设置为1
  • 以user_type1身份登录时,您可以将状态设置为2
  • 以user_type2身份登录时,您可以更新记录的其他属性,但不能更新状态。

当前,我通过使用多种更新方法来处理此问题,并且不同的record_params允许使用不同的更新属性列表。但是我想知道这是否是正确的方法。控制器中有多种更新方法有点奇怪。但是我也一直不容许所有参数,并在方法中检查它们。您如何处理这种情况

2 个答案:

答案 0 :(得分:2)

我认为您可以根据用户的类型来更改允许的参数,如下所示,

def update_params
  params.require(:record).permit(whitelisted_params)
end

def whitelisted_params
  if %w[site_visitor user_type1].include?(user.user_type)
    [:status]
  elsif user.user_type == 'user_type2'
    [:permitted_column_1, :permitted_column_2, :permitted_column_3]
  end
end

您说过,网站访问者始终可以将状态设置为1表示,

1->将状态值合并到允许的参数中。

record_params.merge(status: 1)

2->验证before_action中的状态

在before_action中调用此验证器,并返回错误响应。

before_action: validate_record_update


def validate_record_update
    if %w[site_visitor user_type1].include?(user.user_type)
       valid_status = params[:user][:status] == 1
    elsif user.user_type == 'user_type2'
       valid_status =   params[:user][:status] == 2
    end

   unless valid_status
    # Error response
   end
end

3->模型级别验证器

答案 1 :(得分:1)

如果您的应用程序变得足够大以至于您需要更频繁地处理此问题,那么可能是时候实施策略模式来获得一般性的更可维护的授权控制,而不仅仅是强大的参数。

浏览pundit gem的文档,它使策略的实现非常容易,并允许您维护用于不同参数许可的逻辑:https://github.com/varvet/pundit#strong-parameters

该链接提供了一些很好的示例,可以针对这种情况实施解决方案!