1

我有以下一段代码,其中 params[:sort] 是一个变量,其值为 m 的列之一。

eval "@movie = @movie.sort_by { |m| m.#{params[:sort]}}"

基本上我想根据指定的列对数组@movie 进行排序。有没有办法在没有评估的情况下做到这一点?

4

3 回答 3

6
@movie = @movie.sort_by { |m| m.send(params[:sort])}

例如,您需要进行消毒params[:sort]以防止呼叫destroy

于 2012-07-04T13:54:51.980 回答
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
于 2012-07-04T14:12:37.453 回答
0

您可以使用send来调用访问器方法。根据来自哪里params[:sort]以及应用了何种消毒,这仍然可能是危险的。你不会想params[:sort]成为destroy例子。

如果您只打算读取属性,那么最简单的方法可能是调用read_attribute,它也有别名[],例如

@movie = @movie.sort_by { |m| m[params[:sort]]}
于 2012-07-04T14:02:44.460 回答