Search code examples
ruby-on-railsroutesput

Routing Error: No route matches [PUT] "/goals/4/edit"


I am trying to create a button to change a model record attribute from false to true. I'm using a form_tag as follows:

=form_tag edit_goal_path(goal), method: :post do
  =hidden_field_tag :purchased, value: true
  =submit_tag "Purchase"

It's haml, but feel free to post suggestions with ERB. I'm getting the following error:

No route matches [POST] "/goals/4/edit"
Rails.root: /home/ben/rails_projects/hartwig

However, I already have the following route from resources:

PUT     /goals/:id(.:format)    goals#update 

My controller looks as following:

  def edit
    @goal = Goal.find(params[:id])
  end

  def update
    @goal = Goal.find(params[:id])
    if @goal.update_attributes(goal_params)
      redirect_to '/goals', notice: "Update successful!"
    else
      render '/'
    end
  end
  def goal_params
    params.require(:goal).permit(:item, :description, :picture, :purchased)
  end

How do I get this to work? Or is there a better way to solve this?


Solution

  • Another solution to your problem could be adding a new method to the Goal Controller:

    in goals_controller.rb

    def purchase
    @goal.update_attribute(:purchased, true)
    end
    

    and also add on top (just add :purchase)

    before_action :set_goal, only: [:show, :edit, :update, :destroy, :purchase]
    

    in routes.rb change to

    resources :goals do
     member do
      post 'purchase'
     end
    end
    

    to add a new post routes to your goals now you will have a purchase_goal_path that you can use in your view like this:

    link_to 'Purchase', purchase_goal_path(@goal), method: :post