# Struggling with restfulness

**URL:** <https://www.ruby-forum.com/t/struggling-with-restfulness/154146>\
**Category:** Rails\
**Created:** [November 25, 2008, 9:45pm UTC](https://www.ruby-forum.com/t/struggling-with-restfulness/154146 "2008-11-25T21:45:37Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![crumb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/ea666f/32.png) [@crumb](https://www.ruby-forum.com/u/crumb)\
**Post date:** [November 25, 2008, 9:45pm UTC](https://www.ruby-forum.com/t/struggling-with-restfulness/154146/1 "2008-11-25T21:45:37Z")

</div>

Hello friends, I could need some advice on how to proceed with my  
controllers.

1. GUI shows a calendar, I therefore need to setup a resource to show  
the calendar. So I write a CalendarController.

2. User should be able to create a period in the calendar. By clicking  
days in the calendar the period should be created persistently. I have a  
Period-model for this.

Q: Where do I put the code for creating the Period? Should I setup a  
PeriodController and redirect from CalendarController to  
PeriodController.create somehow? Or maybe I should just do Period.save  
from CalendarController?

Thanks!

/Rasmus

---

<div class="post-metadata">

**Author:** ![crumb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/ea666f/32.png) [@crumb](https://www.ruby-forum.com/u/crumb)\
**Post date:** [November 26, 2008, 4:04pm UTC](https://www.ruby-forum.com/t/struggling-with-restfulness/154146/2 "2008-11-26T16:04:57Z")

</div>

> Q: Where do I put the code for creating the Period? Should I setup a  
> PeriodController and redirect from CalendarController to  
> PeriodController.create somehow? Or maybe I should just do Period.save  
> from CalendarController?  
> This seems to be a point of confusion. A “resource” in the Rails  
> interpretation of the REST convention is not a one-to-one correspondence  
> to “model” objects in an MVC design pattern. It just happens that models  
> tend to be represented by, and as, a resource.

However, you can certainly have resources that are not models and models  
that are not resources. Think a a resource as anything that can be  
described by the basic CRUD operations. In other words, anything that  
can be manipulated by creating, reading, updating or deleting.

For example, user sessions are not necessarily represented by a database  
table, so are not generally ActiveRecord subclasses. Yet you can  
manipulate them as “resources” using the REST convention. The act of a  
user signing into an application can be represented by “creating” a new  
user session resource. And, the act of signing out then becomes a  
“delete” operation on that resource. Notice that the other two CRUD  
operations are not really necessary in this case The controller does not  
have to be involved in the reading or updating of session objects. In  
this case the object is directly manipulated since the manipulation does  
not require an independent request-response cycle. So in Rails the  
controller is not really required here.

The original concept of “web resources” defined by the HTTP protocol  
(independent of anything Rails) were defined by pages and other files  
stored remotely and accessed though HTTP. POST was intended for pushing  
new pages/files to the server, PUT was intended to replace existing  
pages/files with an updated/edited version, GET was to be used to access  
existing pages/files, and DELETE obviously was used to destroy a  
specific page/file.

Then the web browser was invented, by individuals that didn’t seem to  
understand HTTP, and this whole concept was lost. RESTful conventions  
are an attempt to return to the original intent of the HTTP protocol,  
but in the context of the modern dynamic web. REST is intended to be a  
bridge between HTTP CRUD (POST, GET, UPDATE, DELETE) and database CRUD  
(INSERT, SELECT, UPDATE, DELETE). REST is also an attempt to bridge the  
representation of the resources by using existing and well understood  
formats (XML, JSON, YAML, HTML, RSS, ATOM, etc.)

Hopefully, this will help make it clear that REST is not a hard-and-fast  
set of rules. It is a convention, and a framework, for standardizing the  
server-client communication over the HTTP protocol. The important thing  
is for you to “discover” what makes sense for your application and how  
that best fits into this RESTful framework. And that is not always going  
to be: “This is an ActiveRecord so it will always be a resource and have  
it’s own controller.” Or: “This is not an ActiveRecord so isn’t going to  
be a resource with it’s own controller.”

Well that was a long winded way to say: “It’s your application, do what  
makes sense for your particular use case.” Keep the REST design in mind  
if you think it makes sense and fits your case. That being said a lot of  
people are finding that the REST approach really does fit a lot, dare I  
say, most of the use cases people encounter. You just need to get your  
head wrapped around it.

---

<div class="post-metadata">

**Author:** ![crumb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/ea666f/32.png) [@crumb](https://www.ruby-forum.com/u/crumb)\
**Post date:** [November 26, 2008, 8:43pm UTC](https://www.ruby-forum.com/t/struggling-with-restfulness/154146/3 "2008-11-26T20:43:06Z")

</div>

Thanks for info, appreciated!

I suspect it is weird to do a PeriodController just to keep the  
Period-code somewhere. So, where would you put create-code for the  
models that does not have own controllers?

class CalendarController

# TODO: where does this belong? If there are

# more than CalendarView that needs to createPeriod.

def createPeriod  
@p = Period.new  
@p.startDay = param1  
@p.startDay = param2  
@p.save!  
…

Robert W. wrote:

> > Q: Where do I put the code for creating the Period? Should I setup a  
> > PeriodController and redirect from CalendarController to  
> > PeriodController.create somehow? Or maybe I should just do Period.save  
> > from CalendarController?  
> > This seems to be a point of confusion. A “resource” in the Rails  
> > interpretation of the REST convention is not a one-to-one correspondence  
> > to “model” objects in an MVC design pattern. It just happens that models  
> > tend to be represented by, and as, a resource.

---

<div class="post-metadata">

**Author:** ![crumb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/ea666f/32.png) [@crumb](https://www.ruby-forum.com/u/crumb)\
**Post date:** [November 27, 2008, 3:37am UTC](https://www.ruby-forum.com/t/struggling-with-restfulness/154146/4 "2008-11-27T03:37:28Z")

</div>

Rasmus R. wrote:

> Thanks for info, appreciated!
> 
> I suspect it is weird to do a PeriodController just to keep the  
> Period-code somewhere. So, where would you put create-code for the  
> models that does not have own controllers?  
> Actually it wouldn’t weird at all.

Although I don’t know your whole design, I would envision Period as a  
nested resource of Calendar.

map.resources :calendars, :has\_many =\> :periods

This would give you routes such as:  
POST: calendars/1/periods  
GET: calendars/1/periods/1  
PUT: calendars/1/periods/3  
DELETE: calendars/1/periods/4
