2012-04-02 92 views
0

我正在尝试使用form_for标记保存名为'customer'的模型。我没有这个模型的控制器,我希望使用另一个控制器“公共”来完成这个任务。因此,这里是我的观点:form_for rails 3中的错误

<%= form_for @customer do |f| %> 
<div class="field"> 
    <%= f.label :name %><br/> 
    <%= f.text_field :name %> 
</div> 
    .... and then 
<%= f.submit 'Order', :action => :save_order %><br/> 

,这里是我的控制器

def check_out 
@customer = Customer.new 
end 

def save_order 
@customer = Customer.new(params[:customer]) 
credit_card_no = @customer.credit_card 
@order = Order.new 
@order.line_items << @cart.items 
@customer.orders << @order 
if @customer.save 
    # process credit card 
    @cart = nil 
    redirect_to(:action => :show_bill, :id => @order.id) 
else 
    flash[:notice] = 'Could not process your credit card information' 
    render(:action => :check_out) 
end 
end 

的观点是从行动“CHECK_OUT”加载和它应该去行动“save_order”,但我得到的针对'form_for'代码的错误,我做错了什么?但是,如果我为'客户'创建控制器或脚手架并尝试使用该控制器或脚手架,我会将其重定向到'customer/show /:id'路径,而我不希望这样做。

+0

什么是错误? – Rahul 2012-04-02 05:20:16

+0

请发布错误信息。 – 2012-04-02 05:32:40

+0

未定义的方法'customers_path'为#<#:0x8b428e8> – 2012-04-02 05:35:02

回答

1

如果你想在form_for中使用不同的控制器,你需要在form_for中使用:url选项。

<%= form_for @customer, :url => { :controller => "your controller name", 
:action => "save_order" } do |f| %> 

#your code 

<% end %> 
+0

它的工作,我不得不添加一个邮件路由到save_order以及,但它工作,因为我想,谢谢 – 2012-04-02 07:18:14

+0

干杯!干杯!干杯! – 2012-04-02 07:22:37

1

对不起,但您在寻求帮助的时候,如何在做错事的时候做些事情。我会尽力解释,我希望这会帮助你。

如果您想保存您应该使用的客户模型,请猜测客户控制器。有些人喜欢用脚手架,有些人讨厌他们。但是,在保存模型后脚手架代码重定向到show方法这一事实很容易改变,但不应阻止您使用它。脚手架只是帮助初学者和/或有办法想出一些快速而肮脏的事情。改变脚手架生成的代码不仅通常是必要的,而且是学习的好方法。

要保存订单,您应该使用:: drumroll ::,订单控制器。我甚至不知道“公共”控制器会做什么(它本身至少应该告诉你它的名字很差)。

我建议你使用Rails的书进行敏捷Web开发,并通过软件仓库应用程序。它涵盖了所有这个主题,你会学到很多东西。