On Dec 6, 2014, at 4:45 PM, Dave Castellano <[email protected]> wrote:

> Hi,
> 
> Can anyone help...  I am trying to understand how 2 different routes
> like show and update seem to be the same.  Both are
> /questions/:id(.:format).
> 
> GET             /questions(.:format)
> questions#index
> POST           /questions(.:format)
> questions#create


But the VERB (part in all caps) is different. REST uses these different action 
verbs to mean something specific, even if the apparent URL is the same. 

The HTTP specification describes a number of different verbs -- GET, POST, 
PATCH, PUT, and DELETE (probably more, these are the ones Rails cares about). 
Browsers, on the other hand, don't natively do anything except GET and POST. 
Rails-generated forms send along a form variable named _method with the other 
request types, so that when the Rails router receives them, it can translate an 
ordinary POST into a PUT or PATCH or DELETE as needed.

When you post to the /questions URL, you are creating a new question and 
persisting it in the database (modulo any errors halting the save and 
redirect). 

When you GET from that same URL, you are requesting the index list of all 
questions.

> GET             /questions/new(.:format)
> questions#new

This one is a special snowflake -- it requests a object that does not exist 
yet, so you get an empty form to fill out and give that object its parameter 
values.

> GET            /questions/:id/edit(.:format)
> questions#edit
> GET            /questions/:id(.:format)
> questions#show
> PATCH       /questions/:id(.:format)
> questions#update
> PUT            /questions/:id(.:format)
> questions#update
> DELETE     /questions/:id(.:format)
> questions#destroy

It gets a little more subtle when you have saved your question. Now there are 
four different things you can do with the same saved object (show, edit, 
update, or delete) and two of those use the same URL and multiple verbs to 
differentiate what happens. GET with the ID (or another identifier) in the URL 
will show you the object. GET with the ID and /edit in the URL gets you a form 
populated with the current state of the object, ready to send back to the 
server for updating. Both PATCH and PUT will allow you to update an existing 
object with new data. DELETE does what it says. 

> 
> When I try to redirect an action to update, it actually goes to the show
> method and I can not figure out how to redirect to the update action.

You don't ever want to redirect to the update method* -- you should redirect to 
methods that respond with HTML content, like :index or :show or :new or :edit. 
The form you would see on an :edit view would know to PATCH or PUT to the 
/questions/:id path, which would trigger the update method in your controller. 
Your controller cannot (easily) make a PATCH request to another method in the 
same or a different controller. 

> 
> redirect_to :action => :update, :id => next_question_id  ...instead
> redirects to action "show".

If you can describe what you're trying to do here, maybe someone can suggest a 
solution that doesn't step outside of the REST conventions. 

> 
> Thanks,
> 
> Dave

You're welcome,

Walter

*There's a really serious reason for this. You don't ever want a URL in your 
site to alter data just because it was requested. 

> 
> -- 
> Posted via http://www.ruby-forum.com/.
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Ruby on Rails: Talk" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> To post to this group, send email to [email protected].
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/rubyonrails-talk/6ba9e125d1f19b3bd58a024249c91399%40ruby-forum.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/FE358448-DD66-423C-904F-BBC0A1315DCB%40wdstudio.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to