2013-01-10 17 views
10

मैं अपने नियंत्रक में एक विधि को कॉल करने के लिए link_to का उपयोग करना चाहता हूं। हालांकि, कुछ अजीब कारणों से मार्ग show विधि की तलाश में है।रेल: लिंक_to नियंत्रक में कस्टम विधि कॉल करता है

मेरी नजर में:

<% @beverages.each do |beverage| %> 
    .. 
    <%= link_to 'Archive', beverages_archive_path(:id => beverage.id) %> 
    .. 
<% end %> 

मेरी config में/routes.rb

match 'beverages/archive' => 'beverages#archive' 

मेरी beverages_controller.rb में

def archive 
    beverage = Beverage.find(params[:id]) 

    respond_to do |format| 
    # format.html # show.html.erb 
     format.json { render json: beverage } 
    end 
    # beverage.update_attribute('archive', true) 
    end 

जब मैं में संग्रह लिंक पर क्लिक करें देखें, यूआरएल बदलता है: http://localhost:3000/beverages/archive?id=11, हालांकि मुझे निम्न त्रुटि मिलती है।

त्रुटि मैं: error ActiveRecord :: RecordNotFound (पेय के साथ आईडी = संग्रह नहीं मिल सका): एप्लिकेशन/नियंत्रक/beverages_controller.rb: 46: `शो '

किसी भी में क्या मैं गलत कर रहा हूँ पर विचार? आपका सहयोग सराहनीय है!

पी एस। मैंने Rails 3 link_to delete destory method calls show method? पर भी देखा लेकिन कुछ भी काम नहीं कर रहा था।

+0

आप अपने 'routes.rb' दिखाने सकते हैं? शायद आपके पास मैच लाइन के ऊपर 'संसाधन: पेय पदार्थ' जैसी कुछ है? – dimuch

+0

http: // stackoverflow की संभावित डुप्लिकेट।कॉम/प्रश्न/3738573/लिंक-टू-एक्शन-बिल्ड-टू-इंडेक्स-से-बनाने-बनाने के बजाय – weltschmerz

उत्तर

9

क्या आपने इसे अपने मार्गों में आजमाया है?

match 'beverages/:id/archive' => 'beverages#archive', as: :beverages_archive 

यह आपके लिए beverages_archive_path विधि का निर्माण करेगा। साथ ही, जैसा कि आप एक विशिष्ट पेय की तलाश में हैं, उपयोग करें: मार्ग के अंदर आईडी ताकि यह पता चले कि आईडी पैरामीटर कहां से लेना है। कि से

अलावा, आप हमेशा एक लिंक विशेष रूप से बताता है कि किस नियंत्रक और कार्रवाई करने से से जोड़ने के लिए कर सकते हैं:

link_to "Label", :controller => :my_controller, :action => :index 

यहाँ से लिया: Ruby on rails 3 link_to controller and action

+0

धन्यवाद! यह काम किया :) – Rahul

+0

रेल 4 शब्द "मैच" पसंद नहीं है; मैं इसके बजाय 'पोस्ट' या 'get' का उपयोग करने का सुझाव दूंगा। – Tommyixi

4

इसके बजाय अन्य नोटेशन (match) का उपयोग करें।

resources :beverages do 
    collection do 
    get :archive 
    end 
end 

इसे आजमाएं और मुझे कुछ गलत होने पर बताएं।

0

यह जानने के लिए यहां पर्याप्त जानकारी नहीं है कि beverages_archive_path आपके ऐप में क्यों काम करता है - एक समस्या यह है कि आपकी मार्ग फ़ाइल आपके beverages#archive मार्ग के लिए नाम परिभाषित नहीं करती है।

match 'beverages/archive' => 'beverages#archive', :as => :beverages_archive 

या बेहतर अभी तक तो जैसे साधन संपन्न मार्ग सम्मेलनों का उपयोग करें:: क्या आप चाहते हैं कुछ की तरह है

resources :beverages do 
    collection do 
    get :archive 
    end 
end 

क्या हो रहा है आप एक beverages#show मार्ग कि /beverages/:id से मेल खाता है, और यह है कि क्या /beverages/archive मैचों है (:id => 'archive' के साथ)।

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