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
,但解决这种碰撞的真正方法是什么?     
已邀请:
不幸的是,这是一个错误。你必须像你提到的那样设置网址。
= form_for @order, :url => orders_path do |f|
    
这条神奇的道路来自哪里? 我花了很多时间跟踪,但最终我发现url_for使用ActionDispatch :: Routing :: PolymorphicRoutes中定义的
polymorphic_path
方法确定模型的路径。
polymorphic_path
最终通过调用以下内容来获取模型的自动化路径:
record.class.model_name.route_key
我稍微简化了,但基本上就是这样。如果你有一个数组(例如
form_for[@order, @item]
),则在每个元素上调用上面的结果,并将结果与​​
_
连接。 你的Class上的
model_name
方法来自ActiveRecord :: Naming。
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在内的所有值,因此要覆盖该值,我们所要做的就是更改实例变量的值。 对于您问题中的
: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 %>
试试看!     

要回复问题请先登录注册