在Rails项目中,我有一个带有“状态”列/属性的模型
不同的用户可以设置不同的状态值。 例如
当前,我通过使用多种更新方法来处理此问题,并且不同的record_params允许使用不同的更新属性列表。但是我想知道这是否是正确的方法。控制器中有多种更新方法有点奇怪。但是我也一直不容许所有参数,并在方法中检查它们。您如何处理这种情况
答案 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
该链接提供了一些很好的示例,可以针对这种情况实施解决方案!