我有一个活动管理页面,其中包含两个部分,一个包含尚未受邀参加活动的合作伙伴,一个包含受邀参加活动的合作伙伴。可以将合作伙伴添加到事件(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,这会导致 500 错误,因为我的内部不存在动作显示控制器(仅创建和销毁)
这是我的代码:
_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 %>
-
事件.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.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 不包含显示操作,仅包含#create 和#destroy,因此出现错误。
同样,一切正常,除了method: :post
在第一页加载后单击链接时忽略的。奇怪的行为,我在这里很无知。请帮忙。谢谢!