Ruby on rails:奇异资源和form_for

pet*_*hka 62 resources router ruby-on-rails form-for singular

我希望用户只使用一个连接到用户会话的订单.所以我为订单设置了奇异的资源

routes.rb中:

resource :order
Run Code Online (Sandbox Code Playgroud)

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

<%= form_for @order do |f| %>
   ...
<% end %>
Run Code Online (Sandbox Code Playgroud)

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

undefined method `orders_path`
Run Code Online (Sandbox Code Playgroud)

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

mck*_*eed 59

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

= form_for @order, :url => orders_path do |f|
Run Code Online (Sandbox Code Playgroud)

  • Rails的问题已从Lighthouse转移到Github.这是Github中的问题:https://github.com/rails/rails/issues/1769 (5认同)
  • 目前,这是一个解决方案https://github.com/rails/rails/issues/1769#issuecomment-9556381 (2认同)

jsh*_*kol 51

这条神奇的道路来自哪里?

它花了我很多跟踪但我最终发现url_for使用ActionDispatch :: Routing :: PolymorphicRoutes中polymorphic_path定义的方法确定模型的路径.最终通过调用以下内容来获取模型的自动化路径:polymorphic_path

record.class.model_name.route_key
Run Code Online (Sandbox Code Playgroud)

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


model_nameClass上 的方法来自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
Run Code Online (Sandbox Code Playgroud)


我该怎么改变它?

幸运的是,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 %>
Run Code Online (Sandbox Code Playgroud)

试试看!

  • 好答案。不知道为什么它没有更多的支持。 (2认同)
  • 这是一个很好的调查超级答案的答案.要走的路. (2认同)