Ruby on Rails:单一资源和form_for

我希望用户只能连接到用户会话的一个订单。 所以我为订单设置了独特的资源

routes.rb中:

resource :order 

意见/命令/ new.html.erb:

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

但是,当我打开新的订单页面,我得到一个错误:

 undefined method `orders_path` 

我知道,我可以在form_for设置:url => order_path ,但是解决这个冲突的真正方法是什么?

不幸的是,这是一个错误 。 你必须像你提到的那样设置url。

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

那个魔法path从哪里来?

我花了很多的跟踪,但最终我发现url_for使用ActionDispatch :: Routing :: PolymorphicRoutes中定义的polymorphic_path方法来确定模型的path。 polymorphic_path最终通过调用以下几行来获得模型的automagicpath:

 record.class.model_name.route_key 

我简化了一点,但基本上是这样。 如果你有一个数组(例如form_for[@order, @item] ),则在每个元素上调用上面的内容,并将结果与_

您的类上的model_name方法来自ActiveRecord ::命名

 module ActiveModel ... module Naming ... def model_name @_model_name ||= begin namespace = self.parents.detect do |n| n.respond_to?(:use_relative_model_naming?) && n.use_relative_model_naming? end ActiveModel::Name.new(self, namespace) end end end end 

我怎样才能改变它?

幸运的是, ActiveModel :: Name预先计算了包括route_key在内的所有值,因此要覆盖该值,我们所要做的就是更改实例variables的值。

对于您的问题中的:order资源:

 class Order < ActiveRecord::Base model_name.instance_variable_set(:@route_key, 'order') ... end # new.html.erb <%= form_for @order do |f| # Works with action="/order" %> ... <% end %> 

试试看!

Interesting Posts