I’m having troubling completing a task the RESTful way. I have a “tasks” controller, and also a “complete_tasks” controller.
I have this in the complete_tasks_controller create action:
def create
@task = Task.find(params[:id])
@task.completed_at = Time.now
@task.save
end
I tried calling this:
<%=link_to "Complete task", new_task_complete_task_path(@task), :method => :post %>
..but I’m getting errors on that mentioning that “Only get, put, and delete requests are allowed.”
Do you know what I’m doing wrong?
Each map.resources statement routes.rb creates a common RESTful routes for use with the specified resource. The appeal of REST is that is uses the request type and url to determine which action to take. Out of the four verbs associated with HTTP, each one has a specific use.
The reason you’re getting an error about only get, put, and delete requests being allowed, is that you’re using a post request. Essentially you’re telling Rails you want to create a task with an id of one. However you cannot create an item that already exists. Which is why posts are not allowed. Instead you want to use put, because you’re updating an existing record.
You can do it by changing post, to put in your link_to call.
<%=link_to "Complete task", new_task_complete_task_path(@task), :method => :put %>Have a read through the routing guide and the resources documentation, it will help you understand the difference between HTTP requests, as well as provide some insight into how Rails handles those requests.