11

我正在寻找用来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'

在我的饮料控制器.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,但是我收到以下错误。

我得到的错误: 错误 ActiveRecord::RecordNotFound(找不到 id=archive 的饮料):app/controllers/beverages_controller.rb:46:in `show'

知道我做错了什么吗?非常感谢您的帮助!

PS。我还看了Rails 3 link_to delete destory方法调用show方法? 但似乎没有任何效果。

4

3 回答 3

9

你在你的路线中试过这个吗?

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

这将为您创建饮料存档路径方法。此外,当您正在寻找特定的饮料时,请在路线内使用 :id ,以便它知道从哪里获取 id 参数。

除此之外,您始终可以通过执行以下操作来明确指定要链接到哪个控制器和操作的链接:

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

取自这里:Ruby on rails 3 link_to 控制器和操作

于 2013-01-10T16:48:06.507 回答
5

请改用其他符号(不是match)。

resources :beverages do
  collection do
    get :archive
  end
 end

试试这个,如果出了什么问题,请告诉我。

于 2013-01-10T16:42:42.670 回答
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')。

于 2013-01-10T16:44:08.570 回答