如何在没有eval的情况下运行这行ruby代码?

时间:2012-07-04 13:53:30

标签: ruby-on-rails ruby

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

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

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

3 个答案:

答案 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]]}