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!
Sie alles aufgelistet haben, aber der Fehler, den Sie bekommen. – Zabba
Sie haben Recht, ich füge es zur Frage hinzu – Patient55
Lets sehen Sie Ihre routes.rb für diese Route. – Zabba