0

2 つのパーシャルを含むイベント管理ページがあります。1 つはまだイベントに招待されていないパートナー、もう 1 つはイベントに招待されたパートナーです。パートナーは、イベントに追加する (other_partners コレクション) か、削除する (current_partners コレクション) ことができます。

アクションの順序によって奇妙な動作

削除してから作成 => すべて問題ありません。無制限に追加および削除できます

ページが読み込まれると、問題なくパートナーを削除できます (メソッド: :delete)。パートナーは current_partners コレクション (部分的) から消え、other_partners コレクション (部分的) に表示されます。パートナーを追加しようとすると、機能し、パートナーが current_partners コレクションに追加され、other_partners コレクションから削除されます

Create then GET 500 ERROR => Rails は ujs を無視しているようです

ページがロードされたら、other_partner パーシャル内のパートナーをクリックしてイベントに追加 (メソッド: :post) すると、Rails は を無視し、method: :post提供された URLを取得します。コントローラー (作成と破棄のみ)

これが私のコードです:

_other_partner.html.erb

イベントに参加しないユーザーのパートナーを含むパーシャルです。パートナーをクリックすると、イベントに追加され、other_partners コレクションから消え、current_partners コレクションに表示されます。

URL は /events/1/manage_partners?id=21 のようになっていることに注意してください。イベントとパートナー間のリンクを作成するために、パートナーの ID を追加のパラメーターとして渡します。パーシャルは既に大きなフォーム内にあるため、ボタンは使用していません。

  <%= 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 %>");

-

events/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

-

レイアウト/application.html.erb

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

-

assets/javascript/application.js (bower によってロードされた jquery-ujs)

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

-

ルート.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 ルート出力

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

具体的に POST を要求すると、Rails は GET を試みます。manage_partners_controller.rb には show アクションが含まれておらず、#create と #destroy のみが含まれているため、エラーが発生します。

繰り返しmethod: :postますが、最初のページの読み込み直後にリンクがクリックされたときに無視されるものを除いて、すべて正常に機能します。奇妙な振る舞いで、私はここではほとんど無知です。助けてください。ありがとうございました!

4

1 に答える 1

0

レベルのネストが深すぎることが原因である可能性があります。リソースを 1 レベル以上ネストしないでください。これを見てください http://guides.rubyonrails.org/routing.html#nested-resources

ターボリンクの問題を解決した私のページのヘッダーにこれを入れてください

  if(typeof Turbolinks != 'undefined') {
    $(document).on("page:change", function(){
      myFunction();
    });
  }
  else {
    $(document).ready(function (){
      myFunction();
    }); 
  }
于 2016-04-10T02:05:26.087 に答える