2012-07-04 2 views
1

У меня есть следующий фрагмент кода, где params [: sort] - это переменная, значение которой является одним из столбцов m.Как я могу запустить эту строку кода ruby ​​без eval?

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

В основном я хочу отсортировать массив @movie в соответствии с указанным столбцом. Есть ли способ сделать это без eval?

+2

Мне лично нравится сортировать фильмы по ключевому слову "destroy". – tokland

+0

также шаблон 'var = f (var)' довольно сомнительный, почему бы не создать новую переменную для нового значения? – tokland

ответ

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

Вам необходимо дезинфицировать params[:sort] для предотвращения вызова destroy, например.

+1

Спасибо, сработало. :) – FiniteA

+0

Для белого списка столбцов выйдите http://railscasts.com/episodes/228-sortable-table-columns - вы сортируете столбцы после их получения из базы данных, railscast показывает, как сделать базу данных сначала сортировка. – DGM

0

Вы можете использовать метод send для вызова метода доступа. В зависимости от того, откуда и откуда взялось params[:sort], это может быть опасно. Вы бы не хотели, чтобы params[:sort] был destroy, например.

Если вы только собираетесь прочитать атрибуты, то самое простое, что, вероятно, назвать read_attribute, который также псевдонимом, как [], например

@movie = @movie.sort_by { |m| m[params[:sort]]} 
+0

Yup, это работает. – FiniteA

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 
+0

Идея для абстракции, объект # белый список: «белый». Белый («черный», «белый») # => «белый», «синий» .whitelist («черный», «белый») # = > nil'. – tokland

Смежные вопросы