【问题标题】:Rails: link_to calls custom method in controllerRails:link_to 在控制器中调用自定义方法
【发布时间】:2012-12-25 03:04:12
【问题描述】:

我希望使用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 method calls show method? 但似乎没有任何效果。

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

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

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 controller and action

【讨论】:

  • Rails 4 不喜欢“匹配”这个词;我建议改用“post”或“get”。
【解决方案2】:

改用其他表示法(不是match)。

resources :beverages do
  collection do
    get :archive
  end
 end

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

【讨论】:

    【解决方案3】:

    这里没有足够的信息来了解为什么beverages_archive_path 在您的应用程序中起作用——一个问题是您的路由文件没有为您的beverages#archive 路由定义名称。你想要的是这样的:

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

    或者更好的是使用资源丰富的路由约定,如下所示:

    resources :beverages do
      collection do
        get :archive
      end
    end
    

    发生的情况是您有一个匹配/beverages/:idbeverages#show 路由,而这就是/beverages/archive 匹配的内容(与:id =&gt; 'archive')。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 2011-07-23
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多