2016-10-01 91 views
0

我有一个索引视图,列出集合中的订单。每个订单都有一个状态。我希望能够从索引页面AJAX样式更新订单的状态。Rails选择的AJAX更新

不知道为什么在尝试更新记录时ID为NULL。

index.html.erb

<h1>Recent Orders</h1> 

<section class="order-results"> 
    <ol class="list-group"> 
    <%= render partial: 'pf_order', collection: @pf_orders %> 
    </ol> 
</section> 

_pf_orders.html.erb

<%= form_for(pf_order, url: update_receiver_status_path(pf_order)) do |f| %> 
    <%= f.select :receiver_status, options_for_select(receiver_statuses, f.object.receiver_status), {include_blank: true}, {class: 'form-control'} %> 
<% end %> 

pf_orders_controller.rb

def index 
    @pf_orders = PfOrder.all 
end 

def update_receiver_status 
    @status = PfOrder.find_by(id: params[:id]) 
    @status.update_attributes(pf_order_params) 
end 

pf_orders.coffee

jQuery ($) -> 
    $(document).ready -> 
    $("#pf_order_receiver_status").bind 'change', -> 
     $.ajax 
     type: 'PATCH' 
     url: 'pf_orders/update_receiver_status' 
     data: 'pf_order[receiver_status]=' + $('#pf_order_receiver_status').val() 

的routes.rb

patch 'pf_orders/update_receiver_status', as: 'update_receiver_status' 

日志

Started PATCH "/pf_orders/update_receiver_status" for 127.0.0.1 at 2016-10-01 17:36:11 -0400 
Processing by PfOrdersController#update_receiver_status as */* 
    Parameters: {"pf_order"=>{"receiver_status"=>"Completed"}} 
    PfOrder Load (1.0ms) SELECT "pf_orders".* FROM "pf_orders" WHERE "pf_orders"."id" IS NULL LIMIT $1 [["LIMIT", 1]] 
Completed 500 Internal Server Error in 4ms (ActiveRecord: 1.0ms) 



NoMethodError (undefined method `update_attributes' for nil:NilClass): 

回答

1

这里就是我得到了这个才能正常工作:

pf_orders_controller.rb

def update_receiver_status 
    @pf_order = PfOrder.find(params[:id]) 
    if @pf_order.update_attributes(pf_order_params) 
    render json: @pf_order.as_json, status: :ok 
    else 
    render json: {pf_order: @pf_order.errors, status: :unprocessable_entity} 
    end 
end 

def pf_order_params 
    params.fetch(:pf_order, {}).permit(:sequence_number, :message_guid, :hl7_document, :download, :post_status_code, :patient_id, :receiver_status) 
end 

_pf_order.html.erb

摆脱了form_for

<%= label :receiver_status, 'Status:' %> 
      <%= select_tag :receiver_status, 
         options_for_select(receiver_statuses, pf_order[:receiver_status]), 
         onchange: "$.post('#{update_receiver_status_pf_order_path(pf_order)}', 
         {'_method':'patch', 'pf_order[receiver_status]':this.value});", 
         class: 'form-control' %> 

我从pf_orders.coffee

routes.rb中删除了jQuery

resources :pf_orders do 
    patch :update_receiver_status, on: :member 
end 

感谢亚历山大膜瓣豆正确的路线和指着我在正确的方向。

+0

我很高兴你的工作。 –

1

你没有在任何地方提交订单的ID。您可以在日志中验证 Parameters: {"pf_order"=>{"receiver_status"=>"Completed"}}

如果你想坚持RESTful路线(我坚信你应该),你的请求应该去/pf_orders/:id/update_receiver_status

您可以将路线更改为:

patch 'pf_orders/:id/update_receiver_status', as: 'update_receiver_status' 

或者只是添加自定义路由到您的pf_orders资源:

resources :pf_orders do 
    patch :update_receiver_status, on: :member 
end 

最后要做的事情是在你的JavaScript获取订单的ID。这已经在你的表单的动作URL中反映出来了,所以从那里检索它会更容易。

jQuery ($) -> 
    $(document).ready -> 
    $("#pf_order_receiver_status").bind 'change', -> 
     $.ajax 
     type: 'PATCH' 
     url: $('#pf_order_receiver_status').closest('form').attr('action') 
     data: 'pf_order[receiver_status]=' + $('#pf_order_receiver_status').val() 
+0

所做的更改,但现在我越来越: 的ActionController :: RoutingError(无路由匹配[PATCH] “/ pf_orders”): – bradbajuz

+0

尝试'的form_for(pf_order,网址:update_receiver_status_pf_order_path(pf_order))' –

+0

更新了网址并得到相同的错误。 – bradbajuz