我有一个订单模型。
客户可以获得一些消费者友好的视图,让他们创建和查看自己的订单,所有订单都由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。*
答案 0 :(得分:0)
<强>更新强>
这是答案的一半。对于另一半,请参阅有关该问题的评论。
原始回答:
这里的一部分问题是,默认情况下form_for
(其中simple_form_for
是在其上构建的)假设某些事情是关于给定记录使用哪些路径,它是从该记录的类派生的。在您的情况下,由于@purchase
实际上是Order
类的一个实例,因此这些假设将为您解决问题。
如果您查看simple_form_for
生成的表单,您会看到它为表单提供了id和new_order
类,并且表单中的字段的名称如{ {1}}。要在表单中使用order[name]
代替purchase
,您必须将order
选项传递给它。
如果您的对象需要表示为不同的参数,例如充当客户端的人员:
他们给出的例子:
: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。