0

感谢您提前提供帮助!

我是 Rails 新手,一直在尝试遵循本指南:https ://www.youtube.com/watch?v=tyNepRO_ERc&feature=youtu.be

过去我在学校忙之前就实施了 ActionCable,当时并非没有一些麻烦——现在它又给我带来了麻烦。我在该视频中到达 17:00 分钟时没有问题,一切都说得通——但是,当我发送命令时,它没有显示任何消息。

所以,我所看到的:

“hello world”出现了,但没有任何给定的输入(甚至在重新加载页面时也没有)

首先在我的终端:

在 2016-05-23 21:45:00 -0600 开始为 ::1 获取“/cable”

在 2016 年 5 月 23 日 21:45:00 -0600 开始为 ::1 获取“/cable/”[WebSocket]

成功升级到 WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)

RoomChannel 正在发送订阅确认

RoomChannel 正在从 room_channel 流式传输

RoomChannel#speak({"message"=>"Travis: Neat!"})

[ActionCable] 广播到 room_channel:“Travis:整洁!”

RoomChannel 传输“Travis:Neat!” (通过从 room_channel 流式传输)

网页控制台:

App.room.speak('特拉维斯:整洁!')

真的

我可以发布一些代码,我应该发布一些代码,但我相当确定我的所有代码都遵循视频。我将对其进行一段时间的整理,我只是更多地寻找任何提示/见解/帮助以检查其他想法/事物。在我之前尝试实现 ActionCable 时,我也遇到过类似的问题,消息甚至会被发送并处理,但直到重新加载网页后才会显示。

感谢您的任何帮助,

...好吧,我想我最好先放一些代码:

javascripts/channels/room.coffee

App.room = App.cable.subscriptions.create "RoomChannel",
# Called when the subscription is ready for use on the server
connected: ->

# Called when the subscription has been terminated by the server
disconnected: ->

# Called when there's incoming data on the websocket for this channel
received: (data) ->
$('#messages').append "<div>#{data}</div>"

speak: (message) ->
@perform 'speak', message: message

javascripts/cable.coffee

#= require action_cable
#= require_self
#= require_tree ./channels
#
@App ||= {}
App.cable = ActionCable.createConsumer()

频道/room_channel.rb

class RoomChannel < ApplicationCable::Channel
  def subscribed
    stream_from "room_channel"
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end

  def speak(data)
    ActionCable.server.broadcast 'room_channel', data['message']
  end
end

/控制器/rooms_controller.rb

class RoomsController < ApplicationController
  def show
    @messages = Message.all
  end
end

/models/message.rb

class Message < ApplicationRecord
    after_create_commit { BroadcastMessageJob.perform_later self  }
end

/views/messages/_message.html.erb

<p> <%= message.content %> </p>

/views/rooms/show.html.erb

<h1>ActionCable Chat</h1>

    <%= render @messages %>

/config/environments/development.rb(我在这里插入了这一行,这实际上解决了我几个月前尝试使用 ActionCable 时的问题)

ActionCable.server.config.disable_request_forgery_protection = true

/config/cable.yml

production:
  adapter: redis
  url: redis://localhost:6379/1

/config/database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  timeout: 5000
development:
  <<: *default
  database: [InsertNameOfMyAppHere]_development

老实说,我知道,我的 Gemfile 是一团糟:

   ruby '2.3.1'
    source 'https://rubygems.org'
    
    
    # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
    gem 'rails','>= 5.0.0.rc1'
    gem 'pg'
    # Use sqlite3 as the database for Active Record
    
    #gem 'sqlite3'
    # Use SCSS for stylesheets
    gem 'sass-rails', '~> 5.0'
    # Use Uglifier as compressor for JavaScript assets
    gem 'uglifier', '>= 1.3.0'
    # Use CoffeeScript for .coffee assets and views
    gem 'coffee-rails', '~> 4.1'
    # See https://github.com/rails/execjs#readme for more supported runtimes
    # gem 'therubyracer', platforms: :ruby
    
    # Use jquery as the JavaScript library
    gem 'jquery-rails'
    # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
    gem 'turbolinks'
    # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
    gem 'jbuilder', '~> 2.0'
    # bundle exec rake doc:rails generates the API under doc/api.
    gem 'sdoc', '~> 0.4.0', group: :doc
    
    # Use ActiveModel has_secure_password
    # gem 'bcrypt', '~> 3.1.7'
    
    # Use Unicorn as the app server
    # gem 'unicorn'
    
    # Use Capistrano for deployment
    # gem 'capistrano-rails', group: :development
    
    group :development, :test do
      # Call 'byebug' anywhere in the code to stop execution and get a debugger console
      gem 'byebug'
    end
    
    group :development do
      # Access an IRB console on exception pages or by using <%= console %> in views
      gem 'web-console', '~> 2.0'
    
      # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
      gem 'spring'
    end
    
    gem 'devise', '>= 4.0.0.rc1'
    gem 'sass', '~> 3.4', '>= 3.4.20'
    gem 'acts_as_votable', '~> 0.10.0'
    #comments/discussions:
    gem 'simple_form', '~> 3.2', '>= 3.2.1'
    gem 'puma'
    gem 'actioncable', '~> 5.0.0.rc1'
    gem 'therubyracer'
    gem 'execjs'
    gem 'record_tag_helper'
    gem 'redis' 

启动服务器时我的终端

Array values in the parameter to `Gem.paths=` are deprecated.
Please use a String or nil.
An Array ({"GEM_PATH"=>["/Users/Kegan/.rvm/gems/ruby-2.3.1", "/Users/Kegan/.rvm/gems/ruby-2.3.1@global"]}) was passed in from bin/rails:3:in `load'
=> Booting Puma
=> Rails 5.0.0.rc1 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
[Simple Form] Simple Form is not configured in the application and will use the default values. Use `rails generate simple_form:install` to generate the Simple Form configuration.
Puma starting in single mode...
* Version 3.4.0 (ruby 2.3.1-p112), codename:
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop

[回应格雷厄姆·斯利克]

App.room.speak('这有效吗?') true

————————————————————————</p>

这行得通吗?

————————————————————————</p>

添加代码:(Javascripts/channels/room.coffee)

  received: (data) ->
    console.log(data)
    $('#messages').append "<div>#{data}</div>"
4

1 回答 1

3

你没有任何div#messagesid 所以:

$('#messages').append "<div>#{data}</div>"

不管用。将其添加到您的views/rooms/show.html.erb 中的html 中:

 <h1>ActionCable chat</h1>
 <div id="messages">
   <%= render @messages %>
 </div>

另外,您的 jquery 不正确,应该是:

 $('#messages').append("<div>" + data + "</div>")
于 2016-05-25T17:44:15.193 回答