Rails meneruskan variabel ke metode view helper dari pemilihan formulir

Saya memiliki sedikit kode dalam model user.rb saya seperti ini:

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

Di user_controller saya, saya meneruskan ke metode show @metrics = User.aggregate(@articles) (@artikel hanyalah subkumpulan artikel untuk pengguna itu)

Sekarang dalam pandangan saya (user#show) saya memanggil @metrics.each do |m| dan kemudian menampilkan semua hal yang berbeda dalam sebuah tabel. Sekarang menurut video ini tampaknya metode link_to dengan parameter url tampaknya menjadi cara terbaik untuk membuat pengguna secara dinamis mengubah hal-hal yang ingin mereka urutkan.

Bagaimana saya bisa memasukkan parameter url untuk mengurutkan array? Saya mencoba memanggil @metrics.sort_by{|h| h[params[:sort]]}.each do |m| dengan :sort menjadi parameter url dari tautan saya (yaitu klik tautan tajuk tabel tampilan melewati :sort => ":views". Pada dasarnya saya mencoba melakukan ini sort_by{|h| h[:views]} karena itu berfungsi dengan baik untuk menyortir array. Namun tidak ada yang terjadi. Array tidak ada tidak diurutkan.

Sunting:

Saya menyelesaikannya dengan membuat metode agregat meneruskan kunci sebagai string (yaitu "id" dan bukan :id). maka parameter url berfungsi dengan baik.

<%= link_to "Views", :sort => "views"%> sekarang mengurutkannya berdasarkan penayangan dalam urutan menaik.


person Killerpixler    schedule 10.03.2014    source sumber
comment
Tepatnya, teruskan sebagai tampilan string dan Anda selalu dapat melakukan .to_sym jika perlu. params[:sort] # => "views" params[:sort].to_sym # => :views   -  person Rafa Paez    schedule 10.03.2014


Jawaban (1)


Untuk memesan dalam mode descending Anda dapat meniadakan - elemen yang Anda gunakan untuk mengurutkan. Memesan selambat-lambatnya ascending lalu melakukan revert pada koleksi Anda tidak efisien.

Contohnya

$> [{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}] 

Dalam bentuk tampilan Anda, Anda akan memiliki sesuatu seperti ini (misalnya RadioButton tetapi bisa berupa Select atau apa pun yang Anda inginkan):

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

Kemudian di helper Anda, dapatkan nilainya menggunakan params[:radio_order]:

aggregate('views', params[:radio_order])
person Rafa Paez    schedule 10.03.2014
comment
Saya tahu cara mengurutkan (seperti yang Anda lihat di atas dalam kode saya) tetapi bagaimana cara mendapatkannya dari bidang formulir ke dalam tampilan pembantu? - person Killerpixler; 10.03.2014
comment
Saya mengedit pertanyaan saya. Tampaknya cara yang lebih dinamis adalah dengan parameter url tetapi saya tidak bisa membuatnya berfungsi dengan pernyataan sort_by{}. Mohon saran - person Killerpixler; 10.03.2014