Rails:link_to调用控制器中的自定义方法

Rah*_*hul 10 ruby ruby-on-rails

我希望用来link_to调用我的控制器中的方法.然而,由于一些奇怪的原因,该路线寻找该show方法.

在我看来:

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

在我的config/routes.rb中

match 'beverages/archive' => 'beverages#archive'
Run Code Online (Sandbox Code Playgroud)

在我的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
Run Code Online (Sandbox Code Playgroud)

当我单击视图中的存档链接时,URL确实更改为:http://localhost:3000/beverages/archive?id=11,但是我收到以下错误.

我得到的错误: 错误 ActiveRecord :: RecordNotFound(无法找到带有id = archive的Beverage):app/controllers/beverages_controller.rb:46:在`show'中

对我做错了什么的想法?非常感谢您的帮助!

PS.我还看了Rails 3 link_to删除destory方法调用show方法? 但似乎没什么用.

dch*_*cke 9

你在路线上试过这个吗?

match 'beverages/:id/archive' => 'beverages#archive', as: :beverages_archive
Run Code Online (Sandbox Code Playgroud)

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

除此之外,您可以通过以下方式告诉链接具体链接到哪个控制器和操作:

link_to "Label", :controller => :my_controller, :action => :index
Run Code Online (Sandbox Code Playgroud)

从这里开始:Ruby on rails 3 link_to控制器和动作


Mur*_*foX 5

请改用其他符号 (not match)。

resources :beverages do
  collection do
    get :archive
  end
 end
Run Code Online (Sandbox Code Playgroud)

试试这个,如果出现问题,请告诉我。