我希望使用link_to
来调用控制器中的方法。但是,由于某些奇怪的原因,该路由会查找show
方法。
在我看来:
<% @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
,但是我收到以下错误。
我得到的错误: ActiveRecord :: RecordNotFound(找不到具有id = archive的Beverage): app / controllers / beverages_controller.rb:46:在'show'
对我做错了什么的任何想法?非常感谢您的帮助!
PS。我也看了Rails 3 link_to delete destory method calls show method? 但似乎没什么用。
答案 0 :(得分:9)
你在路线上试过这个吗?
match 'beverages/:id/archive' => 'beverages#archive', as: :beverages_archive
这将为您创建beverages_archive_path方法。此外,当您正在寻找特定的饮料时,请在路线中使用:id,以便它知道从哪里获取id参数。
除此之外,您可以通过以下方式告诉链接具体链接到哪个控制器和操作:
link_to "Label", :controller => :my_controller, :action => :index
答案 1 :(得分:4)
请改用其他符号(不是match
)。
resources :beverages do
collection do
get :archive
end
end
尝试一下,如果出现问题,请告诉我。
答案 2 :(得分: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'
)。