Saya memiliki khas fasilitas pencarian dalam aplikasi yang menampilkan daftar hasil yang dapat paginasi, diurutkan, dilihat dengan berbeda records_per_page nilai, dll. Masing-masing pilihan ini dikendalikan oleh parameter pada query string. Contoh sederhana:
/search?q=test&page=2
Sekarang mengatakan saya perlu menampilkan satu set link yang membedakan records_per_page nilai 10, 20, 30. Setiap link harus menyertakan ada parameter kueri, yang dapat menjadi sangat panjang set, plus baru per_page parameter.
/search?q=test&page=2& ... &per_page=10
/search?q=test&page=2& ... &per_page=20
/search?q=test&page=2& ... &per_page=30
Apakah ada cara mudah untuk melakukannya dengan hanya link_to pembantu atau aku harus mengurai dan mereproduksi string query dari permintaan sebelumnya entah bagaimana?
Cara paling sederhana untuk menggabungkan baru params dengan parameter kueri dan TIDAK dengan semua parameter (termasuk yang diperoleh melalui path) adalah untuk bergabung dengan permintaan.query_parameters
link_to 'Search', search_path(request.query_parameters.merge({ per_page: 20 }))
Jika tidak, anda akan berakhir dengan query string duplikasi jalan parameter, misalnya ?action=index&controller=produk&foo=bar
bukan ?foo=bar
.
Jika anda ingin tetap ada params dan tidak mengekspos diri anda untuk serangan XSS, pastikan untuk membersihkan params hash, hanya menyisakan params bahwa aplikasi anda dapat mengirimkan:
# inline
<%= link_to 'Link', params.slice(:sort).merge(per_page: 20) %>
Jika anda menggunakannya di beberapa tempat, bersih params di controller:
# your_controller.rb
@params = params.slice(:sort, :per_page)
# view
<%= link_to 'Link', @params.merge(per_page: 20) %>
Ini bekerja jika link anda adalah pengolahan aren't yang diberikan kepada anda berdasarkan permintaan.params.
require 'rack/utils'
require 'uri'
def modify_query url, options={}
uri = URI(url)
query_hash = Rack::Utils.parse_query(uri.query)
query_hash.merge!(options)
uri.query = Rack::Utils.build_query(query_hash)
uri.to_s
end
puts modify_query('/search?q=test&page=2&per_page=10', 'per_page' => 20)
puts modify_query('/search?q=test&page=2', 'per_page' => 30)
# Outputs
# /search?q=test&page=2&per_page=20
# /search?q=test&page=2&per_page=30
Agak terlambat saya tahu..
Jika anda menggunakan ini sebagai cara untuk menyaring hasil pencarian melihat pembantu saya :)
Ini automagicly menghilangkan semua kosong dan tidak dibutuhkan params dan tambahkan class "yang dipilih" jika semua itu's baru params yang sudah ditetapkan.
def search_to s, args={}
selected = 0
args.each do |k, v|
selected = selected + 1 if params[k] == v.to_s || ( params[k].nil? && v.blank? )
end
if @search_params_base.nil?
@search_params_base = request.parameters.clone
@search_params_base.delete(:action)
@search_params_base.delete(:controller)
@search_params_base.delete(:page)
@search_params_base.delete_if{|k, v| v.nil? || v.blank?}
@search_params_base.delete(:utf8) if @search_params_base[:keywords].nil?
end
search_params = @search_params_base.merge(args)
search_params.delete_if{|k, v| v.nil? || v.blank?}
link_to s, search_path + '?' + search_params.to_param, :class => selected == args.length ? 'selected' : nil
end
Anda kemudian dapat menggunakan ini dalam pandangan anda:
search_to '$80 to $110', :price => 80..110
Atau dalam kasus anda:
search_to '30 per page', :page => params[:page], :per_page => 30