2016-04-09 7 views
0

Ich habe eine Event-Management-Seite, die zwei Teillisten enthält, eine mit den Partnern noch nicht zur Veranstaltung eingeladen, eine mit den Partnern zu der Veranstaltung eingeladen. Partner können entweder zum Event hinzugefügt (other_partners collection) oder entfernt werden (current_partners collection).Rails 4 link_to Methode:: Post und Remote: True seltsames Verhalten

Strange behavior depending on order of actions

löschen dann erstellen => Alles ist in Ordnung, ich kann ohne Begrenzung

hinzufügen und entfernen Sobald die Seite geladen ist, kann ich Partner entfernen (Methode: Löschen) whithout irgendein Problem, Partner verschwindet aus current_partners collection (partially) und erscheint in other_partners collection (partially). Wenn ein Versuch, einen Partner hinzuzufügen, es funktioniert und der Partner zu current_partners Sammlung hinzugefügt und entfernt von other_partners Sammlung

dann 500 ERROR GET erstellen => Rails UJS scheint

zu ignorieren Sobald die Seite geladen, Wenn ich auf einen Partner innerhalb von other_partner partially klicke, um das Ereignis hinzuzufügen (method:: post), ignoriert rails die method: :post und GET die angegebene URL, was zu einem 500 Fehler führt, da die Aktionsshow nicht in meinem Controller vorhanden ist (nur create und zerstören)

Hier ist mein Code:

_other_partner.html.erb

ist ein Teilpartner enthalten Benutzer, die an der Veranstaltung nicht teilnehmen. Wenn Sie auf einen Partner klicken, wird er zum Ereignis hinzugefügt, verschwindet aus der Sammlung anderer_Partner und wird in der Sammlung current_partners angezeigt.

Beachten Sie, dass die URL wie folgt aussieht/events/1/manage_partners? Id = 21. Ich übergebe die ID des Partners als zusätzlichen Parameter, um die Verbindung zwischen Ereignis und Partner herzustellen. Ich benutze den Button nicht, weil Partialtöne bereits in einer größeren Form vorliegen.

<%= div_for partner, class: "partner__current", 
         data: { behavior: "partner", id: partner.id } do %> 

    <%= link_to event_manage_partners_path(event, id: partner.id), 
       method: :post, 
       data: { behavior: "create-partner" }, 
       remote: true, 
       class: "link--primary" do %> 
     <%= content_tag :div, nil, class: "icon icon__add_circle--black" %> 
    <% end %> 

    <% end %> 

-

_current_partner.html.erb

ist eine teilweise Auflistung alle Partner, die an der Veranstaltung teilnimmt. Wenn Sie auf einen Partner klicken, wird er aus dem Ereignis gelöscht, verschwindet aus der Sammlung current_partners und wird in der Sammlung other_partners angezeigt.

<%= div_for partner, class: "partner__current", 
         data: { behavior: "partner" } do %> 

    <%= link_to event_manage_partner_path(event, partner), 
       method: :delete, 
       remote: true, 
       class: "link--primary" do %> 
     <%= content_tag :div, nil, class: "icon icon__cancel_circle--black" %> 
    <% end %> 

    <% end %> 

-

event.html.erb

<%= render partial: 'partners/other_partner', 
        collection: @event_facade.other_partners, 
        as: :partner, 
        locals: { event: @event_facade.event }, 
        cached: true %> 
<% end %> 

<%= render partial: 'partners/current_partner', 
        collection: @event_facade.current_partners, 
        as: :partner, 
        locals: { event: @event_facade.event }, 
        cached: true %> 
<% end %> 

-

create.js und destroy.js (beide ähnlich sind)

$("[data-behavior='new-partner']").html("<%= j render partial: 'partners/other_partner', collection: @event_facade.other_partners, as: :partner, locals: { event: @event_facade.event }, cached: true %>"); 

$("[data-behavior='current-partners']").html("<%= j render partial: 'partners/current_partner', collection: @event_facade.current_partners, as: :partner, locals: { event: @event_facade.event }, cached: true %>"); 

-

Ereignisse/manage_partner_controller.rb

module Events 
    class ManagePartnersController < ApplicationController 
    before_action :set_event 

    def create # (url looks like /events/1/manage_partners?id=21) 
     @event_facade = EventFacade.new(@event) 
     EventPartnerService.new(@event).join_event(params[:id]) 
     respond_to do |format| 
     format.html { redirect_to edit_event_url(@event) } 
     format.js # { render layout: false } 
     end 
    end 

    def destroy 
     @event_facade = EventFacade.new(@event) 
     EventPartnerService.new(@event).leave_event(params[:id], current_user) 
     respond_to do |format| 
     format.html { redirect_to edit_event_url(@event) } 
     format.js # { render layout: false } 
     end 
    end 

    private 

    def set_event 
     @event = current_user.events.find(params[:event_id]) 
    end 

    end 
end 

-

layout/application.html.erb

<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> 

-

Vermögen/JavaScript/application.js (jquery-UJS von Bower geladen)

//= require jquery/dist/jquery.min 
//= require jquery.turbolinks 
// 
//= require jquery-ujs/src/rails 
//= require turbolinks 

-

routes.rb

resources :users, only: [:index, :show], concerns: :paginatable do 
    resources :events, except: :new, concerns: :paginatable do 
    resources :manage_partners, controller: 'events/manage_partners', only:[:create, :destroy] 
    end 
end 

-

Rake Routen Ausgang

event_manage_partners POST (/:locale)/events/:event_id/manage_partners(.:format) events/manage_partners#create {:locale=>/en-US|fr-FR/} 

event_manage_partner DELETE (/:locale)/events/:event_id/manage_partners/:id(.:format) events/manage_partners#destroy {:locale=>/en-US|fr-FR/} 

Hier ist der Fehler 500:

ActionController::RoutingError (No route matches [GET] "/events/81/manage_partners"): 

Rails versucht zu bekommen, wenn ich konkret fragen für POST. Die Datei manage_partners_controller.rb enthält keine show-Aktion, nur #create und #destroy, daher der Fehler.

Auch hier funktioniert alles gut außer der method: :post die ignoriert wird, wenn die Verknüpfung direkt nach dem ersten Laden der Seite geklickt wird. Seltsames Verhalten, und ich bin ziemlich ahnungslos hier. Bitte helfen Sie. Vielen Dank!

+0

Sie alles aufgelistet haben, aber der Fehler, den Sie bekommen. – Zabba

+0

Sie haben Recht, ich füge es zur Frage hinzu – Patient55

+0

Lets sehen Sie Ihre routes.rb für diese Route. – Zabba

Antwort

0

Könnte sein, dass Sie eine Ebene zu tief verschachteln, sollten Sie Ressourcen nicht mehr als eine Ebene tief nisten. Werfen Sie einen Blick auf diese http://guides.rubyonrails.org/routing.html#nested-resources

dieses in der Kopfzeile auf meiner Seite, die Probleme mit der Turbolink gelöst

if(typeof Turbolinks != 'undefined') { 
    $(document).on("page:change", function(){ 
     myFunction(); 
    }); 
    } 
    else { 
    $(document).ready(function(){ 
     myFunction(); 
    }); 
    } 
+0

hinzugefügt experimentierte ich ein wenig mit jquery-ujs, verschiedene Kombinationen (mit Edelstein, mit Laube, mit und ohne Formen, Baum etc.) versuchen. Es scheint, dass es etwas gibt, das turbolinks + bower jquery-ujs + Baum in /assets/javascript/application.js benötigt, um Dinge zu brechen. Immer noch graben – Patient55

+0

Ich hatte ein Problem mit Turbolinks und Jquery zuvor, schlecht aktualisieren meinen Kommentar mit dem, was es für mich behoben. könnte helfen, yo etc – Yoklan

+0

Ok, so dass ich alle Bower und Komponenten, sauber Schiefer neu installiert. Jetzt wenn ich den require_tree lösche. Aus der Manifestdatei application.js funktioniert es. Wenn ich es lasse, schlägt es fehl. Ich muss eine Datei haben, die stillschweigend fehlschlägt, und ich weiß nicht, wie ich sie anders als das Aktivieren/Deaktivieren (Kommentieren des // = require ...) einzeln identifizieren kann. – Patient55