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

时间:2013-01-10 16:37:05

标签: ruby-on-rails ruby

我希望使用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,但是我收到以下错误。

我得到的错误: error ActiveRecord :: RecordNotFound(找不到具有id = archive的Beverage):   app / controllers / beverages_controller.rb:46:在'show'

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

PS。我也看了Rails 3 link_to delete destory method calls show method? 但似乎没什么用。

3 个答案:

答案 0 :(得分: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

答案 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')。