Rails嵌套路由未定义方法

时间:2015-10-12 01:44:34

标签: ruby-on-rails ruby ruby-on-rails-4

我一直在

undefined method 'orders_path' for #<#<Class:0x007faefee50a88>:0x007faefee414e8>

导航到我的新订单路径网址/users/1/orders/new

坚持这一点,不知道这笔交易是什么。

路线:

devise_for :users, :path => 'accounts'

  resources :users, only: [:index, :show] do
      resources :orders
  end

root index:

<%= link_to "Create an Order", new_user_order_path(current_user.id) %>

形式:

<%= form_for([@user, @order]) do |f| %>

<%= f.hidden_field :user_id %>

  <div class="form-group">
    <%= f.label :name %><br />
    <%= f.text_field :name, autofocus: true, class: "form-control" %>
  </div>

<% end %>

新:

<h1>New Order</h1>

<%= render 'form' %>

<%= link_to 'Back', user_orders_path(@user) %>

2 个答案:

答案 0 :(得分:2)

当你这样写:

<%= form_for(@order) do |f| %>

Rails正在寻找orders_path,但您并没有真正拥有这样的路线,因为您已经定义了嵌套在orders资源下的users资源。因此,您必须将@user@order都传递到以下格式:

<%= form_for([@user, @order]) do |f| %>
    # your code goes here
<% end %>

如果您以这种方式编写表单,那么Rails将查找此路径:user_orders_path将匹配您定义的路由并且将起作用,您将不再收到此错误:

undefined method 'orders_path' for #<#<Class:0x007faefee50a88>:0x007faefee414e8>

因此,这将解决您当前的问题。但是,您的new.html.erb文件中还存在另一个问题:

<%= link_to 'Back', user_orders_path %>

您必须将@user作为参数传递给此方法:

<%= link_to 'Back', user_orders_path(@user) %>

否则,它会再次失败。

希望这有助于解决您的问题。

答案 1 :(得分:0)

由于orders嵌套在用户之上,因此form_for声明需要同时包含用户和订单对象。

<%= form_for([@user, @order]) do |f| %>

您的new模板还需要引用给定的用户。

<%= link_to 'Back', user_orders_path(@user) %>