Hi! I'm developing a test application, just to experiment a little bit
with ajax. Right now I only have a Company model with the attributes
name:string, description:text and voted:boolean. What I'm trying to do
is: in company#index show a "vote" link to vote a company; after the
company has been voted the link should be replaced by an "unvote" link
to unvote it and so on (after unvoting replace with "vote", etc.).
From what I have read so far I expect the following code to work just
fine:
## app/controllers/companies_controller.rb
class CompaniesController < ApplicationController
before_filter :retrieve_company, :only => [:vote, :unvote]
def index
@companies = Company.all
end
def vote
@company.update_attributes :voted => true
end
def unvote
@company.update_attributes :voted => false
respond_to do |format|
format.js { render "vote" }
end
end
private
def retrieve_company
@company = Company.find(params[:id])
end
end
## app/helpers/companies_helper.rb
module CompaniesHelper
def vote_link_for(company)
if company.voted?
link_to "Unvote", unvote_company_path(company), :id =>
"vote_link", :remote => true, :method => "delete"
else
link_to "Vote", vote_company_path(company), :id => "vote_link",
:remote => true, :method => "post"
end
end
end
## app/views/companies/vote.js.erb
$("#vote_link").html("<%= vote_link_for(@company) %>")
## app/views/companies/_company.html.haml
%tr
%td= company.name
%td= company.description
%td= vote_link_for(company)
## config/routes.rb
[...]
root :to => "companies#index"
resources :companies do
member do
post :vote
delete :unvote
end
end
The problem is that the server receives GET requests instead of POST and
DELETE:
Started GET "/companies/1/vote" for 127.0.0.1 at 2011-03-06 22:27:37
+0100
So I receive a Routing Error because I don't have any GET route for
:vote and :unvote.
What am I doing wrong?
Thanks for your time and help.