Restful routing seems excessive at times - I want to simplify

I’m still trying to get used to REST concepts and forms

I have a very simple controller that updates user profile data. I
have this link that takes me to the controller:

<%= link_to(‘Profile’, :controller => “operator_profile”, :action =>
“edit”) %>

I then want to simply display the operator’s data like this:

def edit
@operator = Operator.find(current_operator.id)
end

and I want a form that posts to a update method in operator_profile.
in my routes I have

resources :operator_profile

I feel like I’m completely locked into the 7 base methods of REST and
everything else throws routing errors

I couldn’t even get the update method to work.

Can this be simplified?

On May 5, 6:23am, Clem R. [email protected] wrote:

def edit
@operator = Operator.find(current_operator.id)
end

and I want a form that posts to a update method in operator_profile.
in my routes I have

resources :operator_profile

I feel like I’m completely locked into the 7 base methods of REST and
everything else throws routing errors

It’s just shorthand - you could create the 7 routes on their own, ie
match ‘operator_profiles/:id’, :to => ‘operator_profiles#index’

Or you can pass :only or :except to resources to say you don’t want
all 7. Lastly since you have a concept of current_operator, maybe
resources :operator_profiles just isn’t the right fit (since for
excample your edit or update actions don’t require an id parameter).
You could try the singleton one (ie resource :operator_profile)

Fred

Update:

I realized I should also attempt to go w/ a operations_controller
instead of the operator_profile_controller. So I did that and I now
have in routes:

resources :operations

and in operations controller I have all 7 rest methods.

And now I’m getting this:

No route matches {:controller=>“operators”, :action=>“edit”}

because of this link in application.html.erb:

<%= link_to(‘Profile’, :controller => “operators”, :action => “edit”)
%>

and this fails as well:

<%= link_to(‘Profile’, :controller => “operators_profile”, :action =>
“edit”) %>

My model is operator.rb

Here’s a dump of all my operator related routes:

      operator_profile_index GET    /operator_profile(.:format)
{:action=>"index", :controller=>"operator_profile"}
                             POST   /operator_profile(.:format)
{:action=>"create", :controller=>"operator_profile"}
        new_operator_profile GET    /operator_profile/new(.:format)
{:action=>"new", :controller=>"operator_profile"}
       edit_operator_profile GET    /operator_profile/:id/edit(.:format)
{:action=>"edit", :controller=>"operator_profile"}
            operator_profile GET    /operator_profile/:id(.:format)
{:action=>"show", :controller=>"operator_profile"}
                             PUT    /operator_profile/:id(.:format)
{:action=>"update", :controller=>"operator_profile"}
                             DELETE /operator_profile/:id(.:format)
{:action=>"destroy", :controller=>"operator_profile"}


                   operators GET    /operators(.:format)
{:action=>"index", :controller=>"operators"}
                             POST   /operators(.:format)
{:action=>"create", :controller=>"operators"}
                new_operator GET    /operators/new(.:format)
{:action=>"new", :controller=>"operators"}
               edit_operator GET    /operators/:id/edit(.:format)
{:action=>"edit", :controller=>"operators"}
                    operator GET    /operators/:id(.:format)
{:action=>"show", :controller=>"operators"}
                             PUT    /operators/:id(.:format)
{:action=>"update", :controller=>"operators"}
                             DELETE /operators/:id(.:format)
{:action=>"destroy", :controller=>"operators"}

On May 5, 1:20pm, Clem R. [email protected] wrote:

And now I’m getting this:
<%= link_to(‘Profile’, :controller => “operators_profile”, :action =>
“edit”) %>

My model is operator.rb

Your issue is that the restful edit/update routes requires an id
(which object to edit/update) and you’re not providing one, which is
why I suggested you look at singleton resources.

Fred

On 5 May 2011 13:20, Clem R. [email protected] wrote:

And now I’m getting this:

No route matches {:controller=>“operators”, :action=>“edit”}

because of this link in application.html.erb:

<%= link_to(‘Profile’, :controller => “operators”, :action => “edit”)

Look at your routes and you will see that edit requires an id (so it
knows which one to edit). You have not provided the id in the link.

%>

and this fails as well:

<%= link_to(‘Profile’, :controller => “operators_profile”, :action =>
“edit”) %>

Same problem here I imagine.

Colin

For this route

edit_operator_profile GET /operator_profile/:id/edit(.:format)
{:action=>“edit”, :controller=>“operator_profile”}

Below is wrong

<%=link_to(‘Profile’,:controller => “operators_profile”,:action
=>“edit”)%>

Correct will be

<%=link_to(‘Profile’,:controller => “operators_profile”,:action
=>“edit”, :id => @your_operator_profile)%>

Or even shorter

<%=link_to(‘Profile’,edit_operator_profile(@your_operator_profile))%>

Restful resources are really easy if you look carefully at output of
rake routes


Just a couple of points to add - might be typos in the post, or may be
relevant to your controllers…

On May 5, 1:20pm, Clem R. [email protected] wrote:

Update:

I realized I should also attempt to go w/ a operations_controller
instead of the operator_profile_controller. So I did that and I now
have in routes:

resources :operations

** operations **

and in operations controller I have all 7 rest methods.

And now I’m getting this:

No route matches {:controller=>“operators”, :action=>“edit”}

** operators **

because of this link in application.html.erb:

<%= link_to(‘Profile’, :controller => “operators”, :action => “edit”)
%>

** operators **

and this fails as well:

<%= link_to(‘Profile’, :controller => “operators_profile”, :action =>
“edit”) %>

My model is operator.rb

Here’s a dump of all my operator related routes:

Is your controller operator[s], or operations?