我有以下代码,其中params [:sort]是一个变量,其值是m的列之一。
eval "@movie = @movie.sort_by { |m| m.#{params[:sort]}}"
基本上我想根据指定的列对数组@movie进行排序。没有eval有没有办法做到这一点?
答案 0 :(得分:6)
@movie = @movie.sort_by { |m| m.send(params[:sort])}
您需要清理params[:sort]
以阻止调用destroy
。
答案 1 :(得分:1)
如前所述,您应该使用send
并且当您使用params
(我假设是Rails)时,您应该检查该方法是否存在以避免NoMethodError
异常和更好的是,针对白名单进行测试,以防止某些用户使用它来获取他们不应拥有的数据。
# Just for the example :
valid_sort_methods = Movie.new.attributes.keys - Movie.protected_attributes.to_a
if valid_sort_methods.include? params[:sort]
@movie = @movie.sort_by { |m| m.send params[:sort] }
end
答案 2 :(得分:0)
您可以使用send
来调用访问者方法。取决于params[:sort]
的来源以及应用了哪些消毒,这可能仍然很危险。例如,您不希望params[:sort]
为destroy
。
如果您只打算读取属性,那么最简单的事情可能就是调用read_attribute
,其名称也为[]
,例如
@movie = @movie.sort_by { |m| m[params[:sort]]}