所以,这是一个rails应用程序,但实际上更像是一个普通的ruby问题:
我有一个包含多个范围的模型。例如:
Photo.recent
Photo.popular
Photo.featured
我的应用程序中有一个“浏览照片”视图,我希望能够传递单个参数并让用户指定他们想要查看的范围,即:
example.com/photos/browse?view=recent
这给了我params [:view],我需要将它作为方法调用附加到Photo。
所以我的第一个问题是,你怎么能在Ruby中做那种事情?
其次,如果我不能约束输入,这可能是一个安全风险,如果我只是附加Photo。whatever the user types in the url
那么我就有可能让黑客说example.com/photos/browse?view=delete_all
显然,是一个坏主意。
所以我的第二个问题是,如何创建白名单或者可以调用的东西 - 或者甚至更好地设置某种方法可以安全地从URL接受参数,并且只在用户请求时返回信息一个有效的命名范围。
最后,我有一些仅适用于管理员的范围。我已经定义了用户能力(使用CanCan),因此我可以查询current_user.has_role?
以检查用户是否有权使用任何内容,但有没有办法将权限与范围相关联?
谢谢!
答案 0 :(得分:2)
TBH,除非你有这些范围的 lot ,否则我只需对它们进行硬编码或创建哈希映射将url param值映射到lambdas
如果您确实希望完全按照自己的意思行事,可以执行以下操作:
whitelist = %w(
recent
popular
featured
)
if whitelist.include? params[:view]
photos = Photo.send params[:view].to_sym
end
请参阅:http://apidock.com/ruby/Object/send
编辑:也许试试这个?
if Photo.valid_scope_name? params[:view]
photos = Photo.send params[:view].to_sym
end
这是受保护的方法,因此您可能必须使用:
if Photo.send :valid_scope_name?, params[:view]
photos = Photo.send params[:view].to_sym
end
http://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/valid_scope_name%3F
答案 1 :(得分:1)
要发送方法,请使用send方法:)
Photo.send(params[:view].to_sym)
但是,假设这可能是一个安全问题,那么你是100%正确的。随后,您可能希望执行以下操作:
Photo.send(params[:view].to_sym) if %w(recent popular featured).include?(params[:view])