2013-01-10 45 views
10

我正在尋找使用link_to來調用我的控制器中的方法。然而,由於某種奇怪的原因,該路線尋找show方法。Rails:link_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 

當我點擊存檔鏈接查看,該URL確實更改爲:http://localhost:3000/beverages/archive?id=11,但是我收到以下錯誤。

的錯誤,我得到: error 的ActiveRecord :: RecordNotFound(無法使用id =檔案發現飲料): 應用程序/控制器/ beverages_controller.rb:46:在'秀」

任何我做錯了什麼想法?非常感謝您的幫助!

PS。我也看着Rails 3 link_to delete destory method calls show method? 但似乎沒有工作。

+0

你能證明你的'routes.rb'?可能你在match line之上有'resources:beverages'這樣的東西? – dimuch

+0

http:// stackoverflow的潛在重複。com/questions/3738573/link-to-action-create-going-to-index-rather-than-create – weltschmerz

回答

9

你有沒有在你的路線中試過這個?

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

這將爲您創建beverages_archive_path方法。此外,當您正在尋找特定飲料時,請在路線中使用:id,以便它知道從哪裏獲取id參數。

除此之外,你總是可以告訴一個環節專門做連結的控制器和行動:

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

從這裏摘自:Ruby on rails 3 link_to controller and action

+0

謝謝!這工作:) – Rahul

+0

Rails 4不喜歡單詞「匹配」;我建議使用'post'或'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/:id一個beverages#show路線,而這也正是/beverages/archive比賽(與:id => 'archive')。

相關問題