1

我有一个订单模型。

客户可以获得一些对消费者友好的视图,让他们可以创建和查看自己的订单,所有这些都由 Orders 控制器提供支持。

管理员可以在采购控制器的支持下获得创建、编辑、查看、删除和管理订单的全部视图。

据我所知,Purchase 控制器应该只与 Order 模型对话,但以下错误消息让我认为它正在寻找一个不存在的 Purchase 模型:

ActiveRecord::StatementInvalid in PurchasesController#new
NameError in PurchasesController#new
uninitialized constant Purchase
Rails.root: /Users/steven/Dropbox/testivate

这就是错误的意思吗?如果是这样,我如何阻止 Purchases 控制器尝试查找 Purchase 模型?

我的代码...

应用程序/控制器/purchases_controller.rb:

class PurchasesController < ApplicationController
  def new
    @purchase = Order.new
    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @purchase }
    end
  end
  def create
    @purchase = Order.new(params[:purchase])
    respond_to do |format|
      if @purchase.save
        format.html { redirect_to purchase_path(@purchase), notice: 'Purchase was successfully created.' }
        format.json { render json: @purchase, status: :created, location: @purchase }
      else
        format.html { render action: "new" }
        format.json { render json: @purchase.errors, status: :unprocessable_entity }
      end
    end
  end
end

/config/routes.rb:

Testivate::Application.routes.draw do
  resources :orders
  resources :purchases
end

/app/views/purchases/new.html.haml:

.textbox
  %p#notice= notice
  %h1 New Purchase
  = render 'form'
  = link_to 'List Purchases', purchases_path

/app/views/purchases/_form.html.haml:

= simple_form_for @purchase do |f|
  = f.error_notification
  = f.input :name
  = f.button :submit

更新:所以我刚刚意识到“事务”是 Rails 中的保留字,所以我改变了它。但是还有什么我需要解决的吗?

*更新 2:当我完全注释掉 #new 视图和 _form 时,我仍然会收到错误消息,所以我认为问题出在我的控制器或路由或其他地方,而不是我使用 simple_form。*

4

1 回答 1

0

更新:

这是答案的一半。对于另一半,请参阅对该问题的评论。

原答案:

这里的部分问题是,默认情况下form_forsimple_form_for构建在顶部)假设某些关于给定记录使用哪些路径的事情,它派生自该记录的类。在您的情况下,由于@purchase实际上是Order该类的一个实例,因此这些假设会给您带来麻烦。

如果您查看由 生成的表单simple_form_for,您会发现它为表单提供了一个 id 和一个类new_order,并且表单中的字段具有类似 的名称order[name]。要使用 railspurchase而不是order在表单中使用,您必须为其传递一个:as选项。

文档中form_for

如果您有一个需要表示为不同参数的对象,例如充当客户端的 Person:

他们给出的例子:

<%= form_for(@person, :as => :client) do |f| %>
  ...
<% end %>

在您的情况下,您实际上想告诉它@purchase像“购买”一样对待:

= simple_form_for @purchase, :as => :purchase do |f|
  = f.error_notification
  = f.input :name
  = f.button :submit

这将获得正确的表单 ID 等,以便您可以params[:purchase]像上面一样在创建操作中使用例如。但这还不够,因为表单的操作(URL)最终仍将是/orders. 要更改它,请添加一个:url选项:

= simple_form_for @purchase, :as => :purchase, :url => purchases_path(@purchase) do |f|
  = f.error_notification
  = f.input :name
  = f.button :submit

这也将解决您发布的其他问题。

于 2012-12-03T04:06:11.073 回答