所以我一直在关注DHH关于实施基本聊天室的教程。
对我来说,这个实现工作得很好,直到我尝试集成ActiveJob组件。
我在rails或sidekiq控制台中看不到任何错误消息。但_message部分只是没有被渲染。当我在ActiveJob方法中放置binding.pry时,所有元素看起来都很好,所以我猜测它与作业执行有关吗?
为了进一步支持这种怀疑,我打电话给
ActionCable.server.broadcast('room_channel', message: data['message'])
来自room_channel.rb它运作得很好!
我花了好几个小时就完成了这项工作,并且无法进一步研究如何进行调试。我想知道我是否需要与Sidekiq进行任何不同的redis配置才能使其正常工作。到目前为止我只是说:
config.active_job.queue_adapter = :sidekiq
在application.rb
中我是否还需要redis初始化程序?
对此或任何其他见解的任何建议将不胜感激!
Rails服务器:
// ♥ rails s
=> Booting Puma
=> Rails 5.0.0.1 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.6.0 (ruby 2.2.3-p173), codename: Sleepy Sunday Serenity
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
Started GET "/cable" for ::1 at 2016-08-16 16:25:21 +0100
ActiveRecord::SchemaMigration Load (0.4ms) SELECT "schema_migrations".* FROM "schema_migrations"
Started GET "/cable/" [WebSocket] for ::1 at 2016-08-16 16:25:21 +0100
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
Finished "/cable/" [WebSocket] for ::1 at 2016-08-16 16:25:21 +0100
Started GET "/cable" for ::1 at 2016-08-16 16:25:22 +0100
Started GET "/cable/" [WebSocket] for ::1 at 2016-08-16 16:25:22 +0100
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
RoomChannel is transmitting the subscription confirmation
RoomChannel is streaming from room_channel
RoomChannel#speak({"message"=>"new message"})
(0.1ms) BEGIN
SQL (0.5ms) INSERT INTO "messages" ("content", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id" [["content", "new message"], ["created_at", 2016-08-16 15:25:25 UTC], ["updated_at", 2016- 08-16 15:25:25 UTC]]
(1.3ms) COMMIT
[ActiveJob] Enqueued MessageBroadcastJob (Job ID: 5981c48d-afbc-4fad-a595-198b56aa90f4) to Sidekiq(default) with arguments: #<GlobalID:0x007f82aa837b90 @uri=#<URI::GID gid://dragonfly/Message/39>>
Sidekiq:
bundle exec sidekiq -q default -q mailers
2016-08-16T15:23:32.583Z 70743 TID-ow892ejts INFO: Running in ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin15]
2016-08-16T15:23:32.583Z 70743 TID-ow892ejts INFO: See LICENSE and the LGPL-3.0 for licensing details.
2016-08-16T15:23:32.583Z 70743 TID-ow892ejts INFO: Upgrade to Sidekiq Pro for more features and support: http://sidekiq.org
2016-08-16T15:23:32.584Z 70743 TID-ow892ejts INFO: Booting Sidekiq 4.1.2 with redis options {:url=>nil}
2016-08-16T15:23:32.587Z 70743 TID-ow892ejts INFO: Starting processing, hit Ctrl-C to stop
2016-08-16T15:24:00.652Z 70743 TID-ow89s527k MessageBroadcastJob JID-4ae621ca049eb428ced1c7d2 INFO: start
2016-08-16T15:24:01.153Z 70743 TID-ow89s527k MessageBroadcastJob JID- 4ae621ca049eb428ced1c7d2 INFO: done: 0.501 sec
2016-08-16T15:24:14.351Z 70743 TID-ow89s52rk MessageBroadcastJob JID-fe94b25a9100e83f874ea785 INFO: start
应用程序/任务/ message_broadcast_job.rb
class MessageBroadcastJob < ApplicationJob
queue_as :default
def perform(message)
ActionCable.server.broadcast "room_channel", {message: render_message(message)}
end
private
def render_message(message)
ApplicationController.renderer.render(partial: 'messages/message', locals: { message: message })
end
end
应用程序/资产/ Javascript角/信道/ room.coffee
App.room = App.cable.subscriptions.create "RoomChannel",
connected: ->
# Called when the subscription is ready for use on the server
disconnected: ->
# Called when the subscription has been terminated by the server
received: (data) ->
alert data['message']
speak: (message) ->
@perform 'speak', message: message
$(document).on 'keypress', '[data-behaviour~=room_speaker]', (event) ->
if event.keyCode is 13
App.room.speak event.target.value
event.target.value = ''
event.preventDefault()
答案 0 :(得分:0)
这与ActiveJob或Sidekiq无关。我想渲染部分时一定会出现一些错误。
尝试在Rails控制台中执行该行,
const logPageViews = () => {
if (_.startsWith(window.location.pathname, '/search/')) {
let query = window.location.pathname.replace('/search/', '').replace(/--/g, '/').replace(/-/g, '+');
if (!_.isEmpty(window.location.search)) {
query += `&${window.location.search.replace('?', '')}`;
}
ga.pageview(`/search?query=${query}`);
} else {
ga.pageview(window.location.href.replace(window.location.origin, ''));
}
fbq.pageView();
}
const reducer = combineReducers(reducers);
const store = applyMiddleware(...middlewares)(createStore)(reducer, initialState);
ReactDOM.render(
<Provider store={store}>
<Router routes={getRoutes(store)} history={browserHistory} onUpdate={() => {logPageViews()}} />
</Provider>,
document.getElementById('app')
);
希望您得到一些有意义的错误,例如未定义的方法或类似的东西。