两个控制器,一个型号 - 为什么我的应用程序正在寻找第二个型号?

时间:2012-12-03 03:43:01

标签: ruby-on-rails rails-models

我有一个订单模型。

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

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

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

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

错误是什么意思?如果是,如何阻止Purchases控制器尝试查找购买模型?

我的代码......

应用/控制器/ 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。*

1 个答案:

答案 0 :(得分:0)

<强>更新

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

原始回答:

这里的一部分问题是,默认情况下form_for(其中simple_form_for是在其上构建的)假设某些事情是关于给定记录使用哪些路径,它是从该记录的类派生的。在您的情况下,由于@purchase实际上是Order类的一个实例,因此这些假设将为您解决问题。

如果您查看simple_form_for生成的表单,您会看到它为表单提供了id和new_order类,并且表单中的字段的名称如{ {1}}。要在表单中使用order[name]代替purchase,您必须将order选项传递给它。

来自docs for form_for

  

如果您的对象需要表示为不同的参数,例如充当客户端的人员:

他们给出的例子:

:as

在您的情况下,您实际上想要告诉它将<%= form_for(@person, :as => :client) do |f| %> ... <% end %> 视为“购买”:

@purchase

这将使表单ID等正确,以便您可以使用例如您在上面的创建操作中= simple_form_for @purchase, :as => :purchase do |f| = f.error_notification = f.input :name = f.button :submit 。但这还不够,因为表单的操作(URL)最终仍然是params[:purchase]。要更改它,请添加/orders选项:

:url

这也将解决您发布的other question