Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby on rails: singular resource and form_for

I want user to work with only one order connected to user's session. So I set singular resource for order

routes.rb:

resource :order 

views/orders/new.html.erb:

<%= form_for @order do |f| %>    ... <% end %> 

But when I open the new order page I get an error:

undefined method `orders_path` 

I know, that I can set :url => order_path in form_for, but what is the true way of resolving this collision?

like image 950
petRUShka Avatar asked Sep 17 '10 15:09

petRUShka


1 Answers

Unfortunately, this is a bug. You'll have to set the url like you mention.

= form_for @order, :url => order_path do |f| 

Note that this will properly route to create or update depending on whether @order is persisted.


Update

There's another option now. You can add this to your routes config:

resolve("Order") { [:order] } 

Then when the polymorphic_url method is given an object with class name "Order" it will use [:order] as the url component instead of calling model_name.route_key as described in jskol's answer.

This has the limitation that it cannot be used within scopes or namespaces. You can route a namespaced model at the top level of the routes config:

resolve('Shop::Order') { [:shop, :order] } 

But it won't have an effect on routes with extra components, so

url_for(@order)           # resolves to shop_order_url(@order) url_for([:admin, @order]) # resolves to admin_shop_orders_url(@order)                            #        note plural 'orders' ↑                           #        also, 'shop' is from module name, not `resolve` in the second case 
like image 72
mckeed Avatar answered Sep 28 '22 16:09

mckeed