次のコードがあります。ここで、params[:sort] は、値が m の列の 1 つである変数です。
eval "@movie = @movie.sort_by { |m| m.#{params[:sort]}}"
基本的には、指定された列に従って配列 @movie をソートしたいと考えています。evalなしでこれを行う方法はありますか?
次のコードがあります。ここで、params[:sort] は、値が m の列の 1 つである変数です。
eval "@movie = @movie.sort_by { |m| m.#{params[:sort]}}"
基本的には、指定された列に従って配列 @movie をソートしたいと考えています。evalなしでこれを行う方法はありますか?
@movie = @movie.sort_by { |m| m.send(params[:sort])}
たとえばparams[:sort]
、電話をかけないようにサニタイズする必要があります。destroy
前に述べたように、使用する必要が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
send
アクセサーメソッドを呼び出すために使用できます。どこから来て、どのサニタイズが適用されているかによってparams[:sort]
、これはまだ危険な場合があります. たとえばparams[:sort]
、あなたはなりたくないでしょう。destroy
属性を読み取るだけの場合、おそらく最も簡単な方法は を呼び出すことです。これは、たとえばread_attribute
としてエイリアス化されています[]
@movie = @movie.sort_by { |m| m[params[:sort]]}