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(

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?


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"}

You don’t need to use the restful routes that resources spits out. You’re totally free to define your own routes using match if you would like to.

However, that said, there’s generally a way to work it so that most of the things you might like to do fit into the REST/CRUD architecture. Sticking to the conventions wherever possible will make your code cleaner and more maintainable.

With regards to your specific problem, without seeing your whole routing file it’s hard to say, but do consider consider using the named route:

<%= link_to('Profile', edit_operator_path) %>