Hi!
Reading “Rails For .NET Developers” i started to consider the example of
building the flight system with cancellations. So, I’ve generated
flights
scaffold and passengers scaffold and I’d like that we could cancel the
flight and then, each of the passengers would be informed about that
fact.
So, firstly i’ve written a non-rest code and simply added
“cancel_flight”
method to my FlightsController and generated required routes in
routes.rb.
And it looks like this:
redirect_to flights_path
end
(where Flight model has a method cancel_flight, which of course knows what
to do)
It’s all working, but then I tried to do it the rest way. So, i
considered
added new resource called FlightCancellation, but I don’t want it to
represent any database model. So it looks like this
end
end
And then in my FlightCancellations controller, I’ve something like this
class FlightCancellationsController < ApplicationController
(where Flight model has a method cancel_flight, which of course knows what
to do)
There is no need for a separate controller, one way would be to handle
it within the flights controller Edit action, using a url parameter or
the Submit button name to indicate that cancel is required rather than
edit.
However, REST should not be treated as a religion to which all
requirements must bow. I would say there is nothing wrong with what
you have done (provided that you have used a POST to do it).
creating a new flight on the collection of flights, rather than changing
the state of an existing flight. Sure POST would work (and technically
PATH/PUT is simulated using a POST), but using PATCH/PUT would be more
conventional in a RESTful application.
Yes, I was speaking loosely (which is a cardinal sin) and using POST
to mean one of the set of non-GET verbs. I am showing my age, going
back to the days when there were only the two options.
There is no need for a separate controller, one way would be to handle
it within the flights controller Edit action, using a url parameter or
the Submit button name to indicate that cancel is required rather than
edit.
However, REST should not be treated as a religion to which all
requirements must bow. I would say there is nothing wrong with what
you have done (provided that you have used a POST to do it).
Don’t you mean PATCH/PUT rather than POST? POST would indicate you are
creating a new flight on the collection of flights, rather than changing
the state of an existing flight. Sure POST would work (and technically
PATH/PUT is simulated using a POST), but using PATCH/PUT would be more
conventional in a RESTful application.
I agree it seems to be overkill in this case to create a separate
controller. I see nothing wrong with adding a “cancel” method to the
flight controller.
Having additional methods in a controller isn’t un-RESTful IMHO. You
have a URL (http://example.com/flights/1/cancel) that represents a
change (PATCH/PUT) to an existing resource. What’s un-RESTful about
that?
If I were designing a system like this I would most likely implement my
“Flight” model as a finite-state machine and use additional controller
actions (along with the 7 default ones) to transition the flights
through their various states.
creating a new flight on the collection of flights, rather than changing
the state of an existing flight. Sure POST would work (and technically
PATH/PUT is simulated using a POST), but using PATCH/PUT would be more
conventional in a RESTful application.
Yes, I was speaking loosely (which is a cardinal sin) and using POST
to mean one of the set of non-GET verbs. I am showing my age, going
back to the days when there were only the two options.
Colin
Well technically there are still only two options from inside a web
browser. Still can’t fathom why that hasn’t been fixed in modern
browsers.
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.