【发布时间】:2017-11-18 14:15:25
【问题描述】:
我试图让动作电缆工作。所以我创建了一个带有属性名称的模型 Division 的简单应用程序。
index.html.erb
<div class="container">
<p id="notice"><%= notice %></p>
<% content_for(:page_header) {"DIVISIONS"} %>
<table class="table table-striped">
<thead >
<tr>
<th>Name</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<div id='divisions'>
<%= render @divisions %>
</div>
</tbody>
</div>
<br>
<%= link_to 'New Division', new_division_path %>
</div>
_division.html.erb 部分
<tr>
<td><%= division.name %></td>
<td><%= link_to 'Show', division %></td>
<td><%= link_to 'Edit', edit_division_path(division) %></td>
<td><%= link_to 'Destroy', division, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
app/assets/javascripts/channels/division.coffee
App.division= App.cable.subscriptions.create "DivisionChannel",
connected: ->
disconnected: ->
received: (data) ->
$("#divisions").append(data["division"])
create: (division) ->
@perform 'create', division: division
app/channels/division_channel.rb
class DivisionChannel < ApplicationCable::Channel
def subscribed
stream_from "divisions_channel"
end
def unsubscribed
# Any cleanup needed when channel is unsubscribed
end
def create(data)
# data is like parameters received from front end
Division.create({ name: data['name'] })
end
end
divisions_controller
class DivisionsController < ApplicationController
def index
@divisions = Division.all
end
def new
@division = Division.new
end
def create
division = Division.new(division_params)
if division.save
ActionCable.server.broadcast 'divisions',
division: division.name
head :ok
end
end
def edit
@division = Division.find_by_id(params[:id])
end
def update
@division = Division.find_by_id(params[:id])
respond_to do |format|
if @division.update(division_params)
format.html { redirect_to @division, notice: 'Division was successfully updated.' }
format.json { render :show, status: :ok, location: @division }
else
format.html { render :edit }
format.json { render json: @division.errors, status: :unprocessable_entity }
end
end
end
def delete
end
def destroy
@division.destroy
respond_to do |format|
format.html { redirect_to divisions_url, notice: 'Division was successfully destroyed.' }
format.json { head :no_content }
end
end
def show
@division = Division.find_by_id(params[:id])
end
def division_params
params.require(:division).permit(:name)
end
end
师.rb
class Division < ApplicationRecord
after_create_commit do
DivisionCreationEventBroadcastJob.perform_later(self)
end
end
app/jobs/division_creation_event_broadcast_job_job.rb
class DivisionCreationEventBroadcastJob < ApplicationJob
queue_as :default
def perform(division)
ActionCable.server.broadcast 'divisions_channel', division: render_division(division)
end
private
def render_division(division)
ApplicationController.render(partial: 'divisions/division', locals: { division: division})
end
end
当我创建一个新的部门并重定向到http://localhost:3000/divisions时,屏幕是空白的,记录被保存但没有在其他浏览器上广播。
这是我在终端上得到的:
Started POST "/divisions" for 127.0.0.1 at 2017-11-18 22:08:50 +0800
Processing by DivisionsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"+JjDpuJXIlnJc+yZXVJbBx9JeYA1X1owW5bOH4x6hTiddEWLst6F/fup7r1Kz0L4+6CKDsp9C0NorNVxzuh9gQ==", "division"=>{"name"=>"dgfhfdg"}, "commit"=>"Create Division"}
(0.3ms) BEGIN
SQL (0.3ms) INSERT INTO `divisions` (`name`, `created_at`, `updated_at`) VALUES ('dgfhfdg', '2017-11-18 14:08:50', '2017-11-18 14:08:50')
(0.6ms) COMMIT
[ActiveJob] Enqueued DivisionCreationEventBroadcastJob (Job ID: a3e4564d-6743-44da-9d48-dbb114812a67) to Async(default) with arguments: #<GlobalID:0x007f02f80c1708 @uri=#<URI::GID gid://bcz/Division/61>>
[ActionCable] Broadcasting to divisions: {:division=>"dgfhfdg"}
Completed 200 OK in 7ms (ActiveRecord: 1.2ms)
Division Load (0.9ms) SELECT `divisions`.* FROM `divisions` WHERE `divisions`.`id` = 61 LIMIT 1
[ActiveJob] [DivisionCreationEventBroadcastJob] [a3e4564d-6743-44da-9d48-dbb114812a67] Performing DivisionCreationEventBroadcastJob (Job ID: a3e4564d-6743-44da-9d48-dbb114812a67) from Async(default) with arguments: #<GlobalID:0x007f02f809a7e8 @uri=#<URI::GID gid://bcz/Division/61>>
[ActiveJob] [DivisionCreationEventBroadcastJob] [a3e4564d-6743-44da-9d48-dbb114812a67] Rendered divisions/_division.html.erb (0.9ms)
[ActiveJob] [DivisionCreationEventBroadcastJob] [a3e4564d-6743-44da-9d48-dbb114812a67] [ActionCable] Broadcasting to divisions_channel: {:division=>"<tr>\n <td>dgfhfdg</td>\n <td><a href=\"/divisions/61\">Show</a></td>\n <td><a href=\"/divisions/61/edit\">Edit</a></td>\n <td><a data-confirm=\"Are you sure?\" rel=\"nofollow\" data-method=\"delete\" href=\"/divisions/61\">Destroy</a></td>\n</tr>\n"}
[ActiveJob] [DivisionCreationEventBroadcastJob] [a3e4564d-6743-44da-9d48-dbb114812a67] Performed DivisionCreationEventBroadcastJob (Job ID: a3e4564d-6743-44da-9d48-dbb114812a67) from Async(default) in 6.06ms
我做错了什么?
【问题讨论】:
-
您是否在
DivisionCreationEventBroadcastJob中设置了断点并调用了它?如果是,ActionCable.server.broadcast 'divisions_channel'是否会在app/assets/javascripts/channels/division.coffee内触发您前端的代码?您可以通过在 js 代码中设置断点来检查 -
嗨,我尝试设置断点并且 DivisionCreationEventBroadcastJob 和 app/assets/javascripts/channels/division.coffee 都被调用。但我认为终端的输出也很清楚。在这一点上,我认为问题出在视图中。
-
抱歉,实际上 app/assets/javascripts/channels/division.coffee 中的代码没有被调用,因为没有触发断点。
-
我写了一个答案,你需要引用我来通知我@Catmal