【问题标题】:Creating a new link_to for a nested resource为嵌套资源创建新的 link_to
【发布时间】:2014-05-24 17:36:44
【问题描述】:

我正在尝试使用 link_to 辅助函数为特定产品创建新订单。这是我的:

产品型号

class Product < ActiveRecord::Base
  has_many :orders
end

routes.rb

resources :products, :only => [:show, :new, :create, :index, :update, :destroy] do
    resources :orders, :only => [:create]
  end

查看产品/show.html.erb

<%= link_to 'New Order', new_product_orders_path(@product) %>

订单控制器

class OrdersController < ApplicationController

  def create
    @order = Order.new
  end

end

相关的rake路线:

product_orders POST   /products/:product_id/orders(.:format)                                     orders#create

但是当我这样做时,我得到未定义的方法`new_product_orders_path'

在 Rails 4 中执行此操作的正确方法是什么?

【问题讨论】:

  • 这是您的完整控制器代码吗?发布您的 rake 路线输出。
  • 添加了 rake 路由。这不是完整的控制器代码,你还需要看什么?

标签: ruby-on-rails ruby


【解决方案1】:

在您的路线中添加new 操作

resources :orders, :only => [:create, :new]

您的控制器也缺少new 操作,在您的create 操作中您需要保存记录

class OrdersController < ApplicationController

  before_filter :set_product

  def new
    @order = @product.orders.new
  end

  def create
    @order = @product.orders.new(params[:order])
    @order.save
  end

  private

    def set_product
      @product = Product.where("id =?", params[:product_id]).first
    end

end

【讨论】:

  • 我这样做了,但我仍然得到未定义的方法 `new_product_orders_path' 是正确的辅助方法吗?
【解决方案2】:

我觉得你需要

    resources :products, :only => [:show, :new, :create, :index, :update, :destroy] do
      resources :orders, :only => [:create, :new]
    end

您还可以通过在服务器路径末尾键入“/rails/info/routes”来检查您的路线。

【讨论】:

  • 我这样做了,但我仍然得到未定义的方法 `new_product_orders_path' 是正确的辅助方法吗?
  • 对不起。如上面的答案所述,您还必须在 OrdersController 中创建 new 操作。
猜你喜欢
  • 2019-08-22
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多