2016-04-09 2 views
0

У меня есть страница управления событиями, которая содержит две частичные части, одна из которых не была приглашена на мероприятие партнерам, приглашенным на мероприятие. Партнеры могут быть добавлены в мероприятие (коллекция 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, который игнорируется при нажатии ссылки сразу после загрузки первой страницы. Странное поведение, и я здесь довольно невежественный. Пожалуйста помоги. Спасибо!

+0

Вы перечислили все, кроме ошибки вы получаете. – Zabba

+0

Вы правы, я добавляю его на вопрос – Patient55

+0

Посмотрите на свои маршруты.rb для этого маршрута. – Zabba

ответ

0

Возможно, вы слишком глубоко вложили уровень, вы не должны размещать ресурсы более одного уровня. Посмотрите на эту http://guides.rubyonrails.org/routing.html#nested-resources

Поместите это в заголовок моей страницы, который решал вопросы с turbolink

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

Я немного экспериментировал с jquery-ujs, пытаясь использовать разные комбинации (с драгоценным камнем, с беседкой, с формами и без них, требует дерева и т. Д.). Кажется, что есть что-то, что заставляет turbolinks + bower jquery-ujs + требовать дерево в /assets/javascript/application.js, нарушая все. Еще копание – Patient55

+0

У меня была проблема с turbolinks и jquery, но я обновил свой комментарий с помощью того, что исправил его для меня. может помочь руководство yo и т. д. – Yoklan

+0

Хорошо, поэтому я переустановил все беседки и компоненты, чистый шифер. Теперь, когда я удаляю require_tree. из файла манифеста application.js, он работает. Когда я позволяю, он терпит неудачу. У меня должен быть файл, который терпит неудачу, и я не знаю, как его идентифицировать, кроме как активировать/деактивировать (комментируя // = require ...) каждый по одному. – Patient55

Смежные вопросы