Reputation: 21566
This seems incredibly similar to a question I had answered just a few days ago, but the solution then isn't working now.
I'm building a rails app, and I am trying to have a button_to trigger a destroy in a different controller.
the code I have for the button is
<%= button_to "delete", :controller => :meals, :action => 'destroy', :recipe_id => recipe.id, :method => :post >
when I click the delete button, i get a 'no matches for meals/3' which is the current meal_id.
the destroy in the meals controller looks like this
def destroy @meal = Meal.where("current_user.id => ? AND recipe_id => ?", current_user.id, params[:recipe_id]).first @meal.destroy respond_to do |format| format.html { redirect_to :controller => "user" , :action => "show" } format.xml { head :ok } end end
it appears as though the button_to is completely ignoring the :action and requesting show which does not exist and shouldn't exist.
Upvotes: 30
Views: 55091
Reputation: 17145
And how you part of routes.rb for that one looks like?
Because if you use map.resources then destroy has same path as show but :method => :delete
(which is virtual verb implemented by form and _method=delete param).
Try this:
<%= button_to "delete", {:controller => :meals,
:action => 'destroy', :id => recipe.id }, :method => :delete %>
or if recipe
is instance of Meal
class then
<%= button_to "delete", @recipe, :method => :delete %>
Mind the curly brackets.
Upvotes: 55
Reputation: 241
I know it is way too late for an answer but hope it may help somebody(using Rails 4).
<%= button_to "delete", meal_path(:id => recipe.id), :method => :delete %>
Upvotes: 19