2016-10-01 5 views
0

Ich habe eine Indexansicht, die Bestellungen in einer Sammlung auflistet. Jede Bestellung hat einen Status. Ich möchte den Status einer Bestellung auf der Indexseite im AJAX-Stil aktualisieren können.Schienen AJAX Update auf Wählen

Nicht sicher, warum die ID NULL ist, wenn Sie versuchen, den Datensatz zu aktualisieren.

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() 
1.363.210

routes.rb

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

LOGS

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): 

Antwort

1

Hier ist, wie ich das bekam richtig zu arbeiten:

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

Got der form_for

befreien
<%= 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' %> 

Ich entfernte die jQuery von pf_orders.coffee

routes.rb

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

Dank Alexandre Angelim für die richtige Route und zeigt mich in die richtige Richtung.

+0

Ich bin froh, dass es funktioniert hat. –

1

Sie einreichen nicht die überall ids Ordnung. Sie können dies in Ihren Protokollen überprüfen Parameters: {"pf_order"=>{"receiver_status"=>"Completed"}}.

Wenn Sie möchten, mit RESTful Routen zu bleiben (und ich glaube fest, dass Sie sollten), sollten Sie Anfrage gehen zu /pf_orders/:id/update_receiver_status gehen.

Sie können Ihre Route ändern:

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

oder einfach nur eine benutzerdefinierte Route zu Ihrem pf_orders Ressourcen hinzufügen:

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

Das letzte, was zu tun ist, die Bestellung des ID in Ihrem Javascript abrufen. Dies wird sich bereits in der Aktions-URL Ihres Formulars widerspiegeln, sodass es einfacher ist, sie von dort abzurufen.

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

die Änderungen gemacht, aber ich bin immer jetzt: Action :: RoutingError (Keine Route treffer [PATCH] "/ pf_orders"): – bradbajuz

+0

Versuch 'form_for (pf_order, URL: update_receiver_status_pf_order_path (pf_order))' –

+0

die URL aktualisiert und bekomme den gleichen Fehler. – bradbajuz