randombits
randombits

Reputation: 48500

Rails routes, how to specify this member proper

I currently have some routes that look like the following:

  resources :contests do
    member do
      get :enter
    end
  end

This allows me to do an HTTP GET on a URL that looks like /contests/5/enter. Now, a user can go in, fill in some forms, and be able to submit an entry to the contest. So I'd also like to be able to POST to this URL. I tried doing the following:

 resources :contests do
        member do
          get :enter
          post :enter
        end
      end

This posts to the same controller#action as the GET member that I have specified, so it's not really intuitive. I'd like to be able to direct it to a separate action if at all possible. What's the best way of doing that? I am using Ruby on Rails 4 beta currently.

** UPDATE **

I tried the following but I get an ArgumentError exception when I start the server:

resources :contests do
    member do
      get :enter
      post :enter => "contests#create_entry"
    end
  end

Upvotes: 1

Views: 75

Answers (3)

jokklan
jokklan

Reputation: 3550

You can do something like this:

resources :contests do
  member do
    get :enter
    post '/enter', to: "contests#create_entry", as: "create_entry"
  end
end

However i agree with Ola Tuvesson, you should definitely create a new controller and routes for entries, even though you may not have a model, similiar to how you often have a session controller for login and logout. Something like this:

resources :contests do
  resources :entries, only: [:new, :create]
end

Upvotes: 1

Ola Tuvesson
Ola Tuvesson

Reputation: 5221

I would suggest you make the entries for a contest a child model of contests. That would give you all the CRUD methods on entries and your routes would simply be:

resources :contests do
  resources :entries
end

A GET of /contests/5/entries/new will give you the form for adding an entry and when this POSTs to /contests/5/entries it would create a new entry. It also makes it easy to list all entries for a competition etc. You can easily create the controller, model and the associated views with the scaffold generator, for example:

rails g scaffold Entry contest:references name:string email:string 

The references column type tells the generator to link Contests to Entries in a one to many relationship. Job done.

Edit:

If you still want to rename your routes, here's how:

http://guides.rubyonrails.org/routing.html#overriding-the-named-helpers

HTH

Upvotes: 0

Dogbert
Dogbert

Reputation: 222448

You can specify the controller/action you want to point a route at.

get :enter => "controller#get_enter"
post :enter => "controller#post_enter"

Upvotes: 1

Related Questions