Temel olarak indeks eyleminin üstünde yer alan bir filtre oluşturmaya çalışıyorum. Buradaki fikir, bir kullanıcının belirli bir özellik kümesini kontrol edebilmesidir (diğerlerine önem vermediği özellikler için başkaları tarafından kontrol edilmeden bırakılır). Gönderdikten sonra sonuç, bu özniteliklere uyan tüm öğelerle (işaretlenmemiş öznitelikler göz ardı edilirken) geri gelmelidir.Filtreleme Sonuçları - Ruby on Rails
Bunun nasıl yapılacağı konusunda çeşitli yerlerde bir kod parçası gördüm. Ancak, bu formu ve bu formla ilişkili denetleyici eylemini nasıl oluşturacağınızı gösteren hiçbir şey görmedim. Ayrıca, çoğu zaman onay kutularını kullanmaya çalışacağım ve bunu yapan pek çok örnek görmedim.
Şimdiye dek sahip olduğum şeyin bir örneği. : manhattan_served ve: brooklyn_served özelliklerin sadece 2 örneğidir. Kullanıcıların bir seferde bu özelliklerin 5 veya 6'sını kontrol edebileceği 20 gibi bir şey olmasını umuyorum.
İşte /app/views/experts/filtered_experts.html.erb
<%= form_tag filtered_experts_path, method: :get do %>
<%= label_tag(:manhattan_served, "Serves Manhattan") %>
<%= check_box_tag :manhattan_served, true%>
<%= label_tag(:brooklyn_served, "Serves Brooklyn") %>
<%= check_box_tag :brooklyn_served, true%>
<%= submit_tag "Filter", name: nil %>
<% end %>
benim denetleyicisi yanı da bu
/app/controllers/experts_controller.rb
def filtered_experts
@experts = Expert.where(params[filtering_params])
end
private
def filtering_params
params.slice(:manhattan_served, :brooklyn_served)
end
Sağ şimdi, gönderdiğimde, her zaman tam listeyi iade ediyorum. Benim raylar sunucu günlüğüne baktığımızda, bu denetleyiciye geçirilen oluyor gibi görünüyor:
Processing by ExpertsController#filtered_experts as HTML
Parameters: {"utf8"=>"✓", "manhattan_served"=>"true", "brooklyn_served"=>"true"}
bu sadece bana Brooklyn ve Manhattan hizmet sadece uzmanlar değil dönmek konusunda herhangi bir fikriniz?
Teşekkürler! Ben, gerçi size o olabilir
sayesinde, bu yüzden de kapsamları ile bunu yapmaya içinde bakıyordu. Yaptığım şey, kapsamı çağırmak için form_tag'den gelen bilgileri denetleyiciye nasıl ileteceğiydi.Kontrolör nasıl görünmeli? Mesela benim modelimde kapsam olarak: manhattan_served, -> {nerede (manhattan_served: true)} kapsamı: brooklyn_served, -> {where (brooklyn_served: true)}. Bir kullanıcı sadece Manhattan kutusunu kontrol ederse, kontrolörün neye benzemesi gerekir ki, sadece Manhattan alanını değil, Brooklyn'i mi çağırsın? –
Eğer böyle bir şey için bu kapsam tanımları değiştirirseniz: 'kapsamı: manhattan_served, -> (manhattan_served) {yerleri ("GİBİ manhattan_served?" Manhattan_served || = '%')' Ardından araya zincirleyin edebilirsiniz denetleyiciniz: 'Expert.manhattan_served (params [: manhattan_served]). brooklyn_served (params [: brooklyn_served])' Değer sağlamadığınız takdirde '% LIKE' etkisi joker karakterdir. Yani bu paramlardan biri 'sıfır' olarak değerlendirirse (bunu sağlamadığınız için), bu alanı sadece jokerleyecektir ve diğerini arayacaktır. Her iki paramiti de belirtirseniz, her ikisi için de açık eşleşmeleri döndürür. – 10dot
Teşekkürler. Ben has_scope gem ile gidiş sona erdi. Bunu anlamak için sıfırdan inşa etmek istedim, ama eninde sonunda yapmak istediğim şey için, sıfırdan inşa etmek biraz fazla karmaşık olabileceğini düşünüyorum. Yardım ettiğin için teşekkür ederim –