1

次のコードがあります。ここで、params[:sort] は、値が m の列の 1 つである変数です。

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

基本的には、指定された列に従って配列 @movie をソートしたいと考えています。evalなしでこれを行う方法はありますか?

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 に答える