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 %>
试试看!