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 の Beverage が見つかりませんでした): app/controllers/beverages_controller.rb:46:in `show'

私が間違っていることについて何か考えはありますか?あなたの助けは大歓迎です!

PS。Rails 3 link_to delete destory method calls show method?も調べました。 しかし、何も機能していないようでした。

4

3 に答える 3

9

ルートでこれを試しましたか?

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

これにより、buffers_archive_path メソッドが作成されます。また、特定の飲み物を探している場合は、ルート内で :id を使用して、id パラメーターの取得元を認識できるようにします。

それとは別に、次のようにして、リンク先のコントローラーとアクションを具体的に伝えることができます。

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

ここから取得: Ruby on rails 3 link_to controller and action

于 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は、アプリで機能する理由を知るのに十分な情報がありません。1つの問題は、ルートファイルでルートの名前が定義されていないことです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 に答える