2011-02-02 9 views
5

मैं शून्य प्रोग्रामिंग अनुभव से रेल सीखने की कोशिश कर रहा हूं और एक ऐप बनाने की कोशिश कर रहा हूं। यहां लोगों से बहुत मदद के साथ, मेरे पास उन स्थानों का एक इंडेक्स पेज है जो फ़िल्टर करने योग्य हैं, वे किस क्षेत्र से ड्रॉपडाउन मेनू के माध्यम से हैं। मैं वही प्रभाव डाल सकता हूं लेकिन चेकबॉक्स का उपयोग कर और फ़िल्टर में जोड़ने के लिए कई क्षेत्रों का चयन करने में सक्षम होना चाहता हूं।रिकॉर्ड फ़िल्टर करने के लिए चेकबॉक्स का उपयोग

मॉडल::

class Venue < ActiveRecord::Base 
    belongs_to :user 
    has_many :reviews 
    belongs_to :area 

    scope :north, where(:area_id => "2") 
    scope :west, where(:area_id => "3") 
    scope :south, where(:area_id => "4") 
end 

नियंत्रक:

def index 
    if (params[:area] && Area.all.collect(&:name).include?(params[:area][:name])) 
    @venues = Venue.send(params[:area][:name].downcase) 
    else 
    @venues = Venue.all 
    end 
end 

स्थानों index.html.erb:

<div class="filter_options_container"> 

    <form class="filter_form", method="get"> 
    <%= select("area", "name", Area.all.collect(&:name), {:prompt => 'All Areas'}) %><br> 
    <input type="submit" value="Filter" /> 
    </form> 

    <br><br> 

    <form class="filter_form", method="get"> 
    <% Area.find(:all).each do |a| %> 
     <%= check_box_tag("area", "name") %> 
     <%= a.name %> 
    <% end %> 
    <input type="submit" value="Filter" /> 
    </form> 
</div> 

<div class="venue_partials_container"> 
    <%= render :partial => 'venue', :collection => @venues %> 
    <div class="clearall"></div> 
    <%= link_to 'add a new venue', new_venue_path, :class => "add_new_venue_button" %> 
</div> 

पहले फार्म (ड्रॉपडाउन यह वही है मैं अब तक किया है) filter_options_container में ठीक काम करता है लेकिन चेकबॉक्स (दूसरा फॉर्म) लौट रहा है "प्रतीक को इंटीजर में परिवर्तित नहीं कर सकता "मैं क्या याद कर रहा/गलत कर रहा हूँ?

किसी भी मदद के लिए धन्यवाद।

उत्तर

8

मैं वास्तव में क्या आपके जिसके कारण त्रुटि पता नहीं है, लेकिन मैं आपको बता सकता है कि सहायक जिस तरह से आप यह उम्मीद नहीं कर रहा है सेवा मेरे। the documentation से, यह इस तरह से परिभाषित किया है:

check_box_tag(name, value = "1", checked = false, options = {}) 

तो बार-बार कॉल check_box_tag("area", "name") केवल आपके कई बार दे देंगे। ध्यान दें कि "मान" विशेषता (जो मान आपके सर्वर पर भेजा जाता है जब वह फ़ॉर्म सबमिट किया जाता है) हमेशा "नाम" होता है - जो आप चाहते हैं!

<% Area.all.each do |a| %> 
    <%= check_box_tag("areas[]", a.id) %> 
    <%=h a.name %> 
<% end %> 

बातें मैं बदल दिया है:

इसके बजाय, निम्न प्रयास

  1. मैं Area.find(:all) के बजाय Area.all इस्तेमाल किया - मैं इसे कॉस्मेटिक कारणों के लिए किया था, लेकिन DanneManne का जवाब यह अप्रचलित है का दावा रेल 3 में (मुझे नहीं पता - मैं अभी भी 2.3.8 पर हूं)।
  2. मैंने मूल्य फ़ील्ड में इसके नाम के बजाय क्षेत्र की आईडी का उपयोग किया; यदि आप कर सकते हैं तो आईडी द्वारा चीजों को देखना हमेशा अच्छा होता है - आईडी पूर्णांक होते हैं, और तारों की तुलना में तेज़ी से तुलना करते हैं, और अतिरिक्त तेज़ लुकअप के लिए आपके डेटाबेस में आईडी कॉलम पर हमेशा एक अनुक्रमणिका होगी।
  3. और आखिरी, लेकिन तरह से सबसे महत्वपूर्ण बात मैं इनपुट नाम के बाद [] में फेंक दिया। यह रेल को अंतिम नाम लेने के बजाय, इस नाम से सबमिट किए गए सभी मानों को सरणी में एकत्र करने देता है।नीचे देखें:

यूआरएल फेंकने ...

/whatever?a=3&a=17&a=12 

... एक रेल एप्लिकेशन में आप परम हैश देता है ...

{:a => 12} 

... लेकिन यूआरएल ...

/whatever?a[]=3&a[]=17&a[]=12 

... तुम देता है कि आप क्या चाहते:

{:a => [3, 17, 12]} 

और अगर आप सब area_ids आप में रुचि रखते हैं की एक सरणी है, तो आप सभी स्थानों कि में हैं एक एक लाइनर में उन क्षेत्रों में से किसी प्राप्त कर सकते हैं (नहीं है महान पटरियों?) :

filtered_venues = Venue.all(:conditions => {:area_id => params[:areas]}) 

बस सुनिश्चित करें कि आप उस खोजक कॉल करने से पहले क्षेत्र आईडी का एक मान्य सरणी है बनाने - अगर आप नहीं करते हैं, अपनी शर्तों हैश को मूल्यांकन करेंगे {: area_id => शून्य}, और Rails'll आप पाते हैं उन सभी स्थानों जिनमें क्षेत्र_आईड नहीं है - शायद कोई नहीं, और निश्चित रूप से आप जो चाहते हैं उसे नहीं।

आशा है कि इससे मदद मिलती है!

+0

शानदार काम के लिए बहुत बहुत धन्यवाद! – Dave

+0

@ डेव ग्लैड मैं मदद कर सकता था! –

0

क्षेत्र में अपनी कॉल में। आप तर्क की आपूर्ति करते हैं: सब। यह वाक्यविन्यास रेल 3 में बहिष्कृत है जिसे मैं मानता हूं कि आप इसका उपयोग कर रहे हैं। खोजने के सभी पिछले उपयोग (: सभी, ...) या ढूंढें (: पहला, ...) आदि अब उपयोग नहीं किया जा सकता है। इसके बजाय आप पहली बार के रूप में आप की तरह इसे का उपयोग किया जाना चाहिए: Area.all (...)

एक तरफ ध्यान दें के रूप में, यह भी लग रहा है check_box_tag तर्क की तरह गलत हो सकता है। मुझे लगता है कि आपको "नाम" के बजाय a.name भेजना चाहिए।

यहाँ एक संशोधित रूप है मैं काम करता है लगता है कि:

<form class="filter_form", method="get"> 
    <% Area.all.each do |a| %> 
    <%= check_box_tag("area", a.name) %> 
    <%= a.name %> 
    <% end %> 
    <input type="submit" value="Filter" /> 
</form> 
संबंधित मुद्दे

 संबंधित मुद्दे