Rails передает переменные во вспомогательные методы представления из выбора формы

У меня есть немного кода в моей модели user.rb:

def self.aggregate(articles)
    array = []
    articles.each do |a|
        array << {
            :id => a.nid, 
            :views => a.daily_view_metrics.sum_views(a.nid),
            :date => a.daily_view_metrics.latest_date(a.nid),
            :title => a.daily_view_metrics.latest_title(a.nid),
            :visits => a.daily_view_metrics.sum_visits(a.nid)
            }
    end
    return array
end

В моем user_controller я перехожу к методу show @metrics = User.aggregate(@articles) (@статьи — это просто подмножество статей для этого пользователя)

Теперь, на мой взгляд (user#show), я вызываю @metrics.each do |m|, а затем вывожу все разные вещи в таблицу. Теперь, согласно этому видео, кажется, что метод link_to с параметром url кажется быть лучшим способом заставить пользователей динамически переключаться между тем, что они хотят отсортировать.

Как я могу ввести этот параметр URL для сортировки массива? Я попытался вызвать @metrics.sort_by{|h| h[params[:sort]]}.each do |m| с :sort в качестве параметра URL-адреса из моих ссылок (т. Е. Щелчок по ссылке заголовка таблицы представлений передает :sort => ":views" в. По сути, я пытаюсь сделать это sort_by{|h| h[:views]}, так как это отлично работает для сортировки массива. Однако ничего не происходит. Массив не т отсортировано.

РЕДАКТИРОВАТЬ:

Я решил это, заставив агрегатный метод передавать ключ в виде строки (т.е. «id», а не: id). тогда параметры URL работают прекрасно.

<%= link_to "Views", :sort => "views"%> теперь сортирует по просмотрам в порядке возрастания.


person Killerpixler    schedule 10.03.2014    source источник
comment
Точно, передайте его как строковые представления, и тогда вы всегда сможете сделать .to_sym, если вам нужно. params[:sort] # => "views" params[:sort].to_sym # => :views   -  person Rafa Paez    schedule 10.03.2014


Ответы (1)


Чтобы упорядочить в режиме descending, вы можете отрицать - элемент, который вы используете для сортировки. Заказывать ascending, а затем делать revert свою коллекцию неэффективно.

Например

$> [{a: 'a1', b: 1}, {a: 'a2', b: 2}].sort_by{ |h| -h[:b] }
# => [{:a=>"a2", :b=>2}, {:a=>"a1", :b=>1}] 

$> [{a: 'a1', b: 1}, {a: 'a2', b: 2}].sort_by{ |h| h[:b] }
# => [{:a=>"a1", :b=>1}, {:a=>"a2", :b=>2}] 

В форме вашего представления у вас будет что-то вроде этого (например, RadioButton, но это может быть Select или что вы предпочитаете):

 <%= radio_button_tag 'radio_order', 'ascending', true %> Ascending
 <%= radio_button_tag 'radio_order', 'descending' %> Descending
 <%= submit_tag "Order" %>

Затем в вашем помощнике получите значение, используя params[:radio_order]:

aggregate('views', params[:radio_order])
person Rafa Paez    schedule 10.03.2014
comment
Я знаю, как сортировать (как вы можете видеть выше в моем коде), но как мне получить это из поля формы в помощнике представления? - person Killerpixler; 10.03.2014
comment
Я отредактировал свой вопрос. Кажется, что более динамичный способ - с параметрами URL, но я не могу заставить их работать с оператором sort_by{}. пожалуйста, порекомендуйте - person Killerpixler; 10.03.2014