2015-11-18 45 views
1

您好同事程序员,我正在构建一个应用程序,可以向现有客户添加订单。到目前为止,我可以添加一个客户。但一周之后,我坚持向顾客添加订单。我是新的铁轨(一个月)。我已经关联了客户和ID模型。这是我的代码。向现有客户添加订单

更新: CUSTOMER_ID是在顺序表中一个ForeignKey

客户控制器

class CustomerController < ApplicationController 
    def index 
    @customers = Customer.sorted 
    end 

    def new 
    @customers = Customer.new 
    #hij creert een nieuwe subject 
    end 

    def create 
    #Instantiate a new object using form paramters 
    @customer = Customer.new(customer_params) 
    #Save the object 
    if @customer.save 
    #If save succeeds, redirect to the inex acton 
    flash[:notice] = "Subject created successfully" 
    redirect_to(:action => 'index') 
    else 
    #If save fails, redisplay the form so user can fix problems 
    render('new') #het zit in de new.html template 
    end 
    end 


    def show 
    @customers = Customer.find(params[:id]) 

    end 

    def edit 
    @customer = Customer.find(params[:id]) 
    end 

    def delete 
    @customer = Customer.find(params[:id]) 
    end 

    def destroy 
    customer = Customer.find(params[:id]).destroy #deze is zonder @ omdat het geen template rendert 
    flash[:notice] = "Subject '#{customer.first_name}' destroyed successfully" 
    redirect_to(:action => 'index') 
    end 

    private 
    def customer_params 
    params.require(:customer).permit(:first_name, :last_name) 
    end 
end 

阶控制器

class OrderController < ApplicationController 
    def index 
    @order = Order.find(params[:customer_id]) 
    end 

    def new 
    @orders = Order.new 
    end 

def create 
    @order = Order.new(order_params) 
    if @order.save 
    flash[:notice] = "Subject created successfully" 
    redirect_to(:action => 'index') 
    else 
    render 'customers/show' 
    end 
end 

    end 

    def show 
    @order = Order.find(params[:customer_id]) 
    end 

    def edit 
    end 

    def delete 
    end 

    private 
    def order_params 
    params.require(:order).permit(:customer_id, :pakket, :verstuurt) 
    end 

客户展示查看

<% if !flash[:notice].blank? %> 
    <div class="notice"> 
     <%= flash[:notice] %> 
<% end %> 

<%= link_to("<< Back to List", {:action => 'index'}, :class => 'back-link') %> 

<div class="subjects show"> 
    <h2><%[email protected]_name %></h2> 


    <%= link_to("View Pages", {:controller => 'order', :customer_id => @customers.id}, :class => 'action show') %> 
    <%= link_to("Edit", {:action => 'edit', :id => @customers.id}, :class => 'action edit') %> 
    <%= link_to("Delete",{:action => 'delete', :id => @customers.id}, :class => 'action delete') %> 
    <%= link_to("Create",{:controller => 'order/create', :customer_id => @customers.id}, :class => 'action create') %> 
</div> 

创建新订单到现有的客户页面

<%= link_to("<< Back to List", {:action => 'index'}, :class => 'back-link') %> 

<div class="subject new"> 
    <h2>Create Subject</h2> 

    <%= form_for @order do |f| %> 

    <table summary="subject form fields"> 
     <tr> 
      <th>Package</th> 
      <td><%= f.text_field(:pakket) %></td> 
     </tr> 
     <tr> 
      <th>Sent</th> 
      <td><%= f.text_field(:verstuurt) %></td> 
     </tr> 

    </table> 

    <div class="form-buttons"> 
     <%= submit_tag("Create Subject") %> 
    </div> 

    <% end %> 
</div> 

客户型号

​​

订货型号

Order类<的ActiveRecord :: Base的

belongs_to :customer 

    accepts_nested_attributes_for :customer 

    scope :visible, lambda { where(:visible => true) } 
    scope :invisible, lambda { where(:visible => false) } 
    scope :sorted, lambda { sorted("orders") } 
    scope :newest_first, lambda { order("orders.created_at DESC")} 
    scope :search, lambda {|query| 
     where(["name LIKE ?", "%#{query}%"])} 
end 

错误

ActionController::ParameterMissing in OrderController#create 
param is missing or the value is empty: order 

Extracted source (around line #34): 
32 
33 
34 
35 
36 

    private 
    def order_params 
    params.require(:order).permit(:customer_id, :pakket, :verstuurt) 
    end 

服务器日志

Started GET "/order/create?customer_id=9" for ::1 at 2015-11-18 14:47:40 +0100 
Processing by OrderController#create as HTML 
    Parameters: {"customer_id"=>"9"} 
    Customer Load (0.1ms) SELECT "customers".* FROM "customers" WHERE "customers"."id" = ? LIMIT 1 [["id", 9]] 
Completed 400 Bad Request in 2ms (ActiveRecord: 0.1ms) 

ActionController::ParameterMissing (param is missing or the value is empty: order): 
    app/controllers/order_controller.rb:33:in `order_params' 
    app/controllers/order_controller.rb:14:in `create' 


    Rendered /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_source.erb (4.1ms) 
    Rendered /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (2.0ms) 
    Rendered /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.0ms) 
    Rendered /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (56.6ms) 
    Rendered /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/_markup.html.erb (0.4ms) 
    Rendered /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/_inner_console_markup.html.erb within layouts/inlined_string (0.4ms) 
    Rendered /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/_prompt_box_markup.html.erb within layouts/inlined_string (0.4ms) 
    Rendered /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/style.css.erb within layouts/inlined_string (0.4ms) 
    Rendered /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/console.js.erb within layouts/javascript (49.7ms) 
    Rendered /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/main.js.erb within layouts/javascript (0.4ms) 
    Rendered /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/error_page.js.erb within layouts/javascript (0.5ms) 
    Rendered /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/index.html.erb (111.1ms) 
+0

你的模型呢? Order模型和Customer模型都是? –

+0

你有什么错误?你想要解决什么问题? –

+0

@Sunnyk刚刚发布了它 –

回答

1

你需要的,如果你想创建一个已经涉及到了客户才能使用嵌套路由:

#routes.rb 

resources :customers do 
    resources :orders 
end 

这种方式可以使一个新秩序的特定客户使用/customers/:customer_id/orders/new

然后在您的OrderController中使用如下所示:

def new 
    @customer = Customer.find(params[:customer_id]) 
    @order = @customer.orders.build() 
end 

这样,订单已经与客户相关联,并且表单中的customer_id字段将被填充。

编辑:但是,这仍然允许为每个客户无限制地创建订单。当我听到订单&客户,你可能需要认证和授权,所以看看设计,所以你可以让某个人订购一些东西。而当你打算使用它的时候,你不需要嵌套路由,因为customer_id会在保存前被设置。

+0

改变了它,我仍然得到相同的错误“注意:customer_id是在订单表中的外键)谢谢 –

+0

我犯了一个错字...你可以再试一次吗? –

+0

哦并失去那些accept_nested_attributes_for定义,这不是那些是什么! –

1

好吧,我不知道你是怎么想使用您的控制器......但让我们重构你的OrdersController如下:

class OrdersController < ApplicationController 
    def index 
    @orders = <whatever you want it to be> # Note that I used the plural form of @orders, not @order 
    end 

    def new 
    customer = Customer.find(params[:customer_id]) 
    @order = customer.order.new 
    end 

    def create 
    @order = Order.new(order_params) 
    if @order.save 
     flash[:notice] = "Subject created successfully" 
     redirect_to(:action => 'index') 
    else 
     render 'customers/show' 
    end 
    end 

    def show 
    @order = Order.find(params[:customer_id]) 
    end 

    def edit 
    end 

    def delete 
    end 

    private 
    def order_params 
    params.require(:order).permit(:customer_id, :pakket, :verstuurt) 
    end 
end 

,然后在您的形式顺序:

<%= form_for @order do |f| %> 
    <table summary="subject form fields"> 
    <tr> 
     <th>Package</th> 
     <td><%= f.text_field(:pakket) %></td> 
    </tr> 
    <tr> 
    <th>Sent</th> 
     <td><%= f.text_field(:verstuurt) %></td> 
    </tr> 
    </table> 

    <div class="form-buttons"> 
    <%= f.submit %> 
    </div> 
<% end %> 

这应该适合你。

+0

你的参数[:customer_id]从哪里来?哦,对不起,没有看到他的例子中的代码 –

+0

改变它,我仍然得到相同的错误“注意:customer_id是Order表中的外键)无论如何,谢谢 –

+0

好了,你能把你的服务器上的输出看起来像什么吗?我特别感兴趣的是'params'是 –

1

我是新的铁轨(一个月现在)。

保留它 - 您需要至少3个应用程序,然后才能开始“获取”。迄今为止你做得非常好!


随着其他的答案,有一个更为迫切的担忧:

param is missing or the value is empty: order 

这意味着,你传递参数到控制器,因为你需要未格式化。这会提示您的表单或您的控制器代码不正确。

-

通话的第一站是在这里:

<div class="form-buttons"> 
    <%= submit_tag("Create Subject") %> 
</div> 

它需要<%= f.submit %>

这应该解决眼前的参数错误。

-

在关于如何的order关联到customer你的更广泛的问题,你需要寻找到nested resources

#config/routes.rb 
resources :customers do 
    resources :orders #-> url.com/customers/:customer_id/orders/:id 
end 

这将允许你做到以下几点:

#app/controllers/orders_controller.rb 
class OrdersController < ApplicationController 
    def new 
     @customer = Customer.find params[:customer_id] 
     @order = @customer.orders.new 
    end 

    def create 
     @customer = Customer.find params[:customer_id] 
     @order = @customer.orders.new order_params 
     @order.save 
    end 

    private 

    def order_params 
     params.require(:order).permit(:pakket, :verstuurt) 
    end 
end 

这会自动为您设置foreign_key;让您致电:

#app/views/orders/new.html.erb 
<%= form_for @order do |f| %> 
    <%= f.text_field(:pakket) %> 
    <%= f.text_field(:verstuurt) %> 
    <%= f.submit %> 
<% end %> 

在个别情况下,该导轨导向的例子,here's how your foreign key should look匹配:

enter image description here

+0

谢谢,这意味着分配给我,但我想每个人都混淆的是(customer_id)是Order表中的外键。如果我使用“:id”,那么它很好地说它已经失踪了 –

+0

这不会让任何人困惑,因为这听起来很合理。你现在有什么问题?因为瑞克的答案更多地解释了解决方案! –

+0

如果'order belongs_to:customer',那么[您需要'orders'表中的外键](http://guides.rubyonrails.org/association_basics.html#the-belongs-to-association),就像你有 –

0

更改/命令/新本:

<%= form_for @order do |f| %> 
     <table summary="subject form fields"> 
     <tr> 
      <th>Package</th> 
      <td><%= f.text_field(:pakket) %></td> 
     </tr> 
     <tr> 
     <th>Sent</th> 
      <td><%= f.text_field(:verstuurt) %></td> 
     <%= f.hidden_field(:customer_id) %> 
     </tr> 
     </table> 

    <div class="form-buttons"> 
    <%= f.submit %> 
    </div> 
<% end %> 
+0

是的先生我已经做到了 –