У меня есть страница управления событиями, которая содержит две частичные части, одна из которых не была приглашена на мероприятие партнерам, приглашенным на мероприятие. Партнеры могут быть добавлены в мероприятие (коллекция other_partners) или удалены (коллекция current_partners).Rails 4 link_to метод:: post и remote: true странное поведение
Strange behavior depending on order of actions
Удалить затем создать => Все в порядке, я могу добавлять и удалять без ограничений
После загрузки страницы, можно удалить партнера (метод:: удалить) Whithout любой проблемы, партнер исчезает из коллекции current_partners (частично) и появляется в коллекции other_partners (частично). Если попытаться добавить партнер, он работает, а партнер будет добавлен в коллекцию current_partners и удален из коллекции other_partners
НАПИСАТЬ затем GET 500 ERROR => Rails, кажется, игнорирует UJS
После загрузки страницы, Если я нажимаю на партнера внутри part_partner, чтобы добавить (метод:: post) его к событию, rails игнорирует method: :post
и GET предоставленный url, что вызывает ошибку 500, потому что показ действия отсутствует внутри моего контроллера (только создайте и уничтожить)
Это мой код:
_other_partner.html.erb
является партнерами частичной объемлющего пользователя, которые не участвуют в этом мероприятии. Нажав на партнера, он добавляется к событию, исчезает из коллекции other_partners и появляется в коллекции current_partners.
Обратите внимание, что URL-адрес выглядит как/events/1/manage_partners? Id = 21. Я передаю идентификатор партнера в качестве дополнительного параметра, чтобы создать связь между событием и партнером. Я не использую кнопку, потому что частицы уже находятся в более крупной форме.
<%= 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
частичный перечень всех партнеров, участвует в мероприятии. При нажатии на партнера он удаляется из события, исчезает из коллекции current_partners и появляется в коллекции other_partners.
<%= 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 и destroy.js (оба похожи)
$("[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 %>");
-
события/manage_partner_controller.Р.Б.
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
-
макет/application.html.erb
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
-
активов/JavaScript/application.js (JQuery-UJS загруженной дачи)
//= 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
-
рейк маршруты выходного
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/}
Вот 500 ошибка:
ActionController::RoutingError (No route matches [GET] "/events/81/manage_partners"):
Rails пытается получить, когда я специально спросить для POST. Управляющий_partners_controller.rb не содержит действие show, только #create и #destroy, таким образом, ошибка.
Снова все работает отлично, за исключением method: :post
, который игнорируется при нажатии ссылки сразу после загрузки первой страницы. Странное поведение, и я здесь довольно невежественный. Пожалуйста помоги. Спасибо!
Вы перечислили все, кроме ошибки вы получаете. – Zabba
Вы правы, я добавляю его на вопрос – Patient55
Посмотрите на свои маршруты.rb для этого маршрута. – Zabba