【问题标题】:Rails 5: ActionCable doesn't save messages into dbRails 5:ActionCable 不会将消息保存到数据库中
【发布时间】:2018-11-09 10:42:33
【问题描述】:

我目前面临的问题是我的消息没有保存到数据库中。我认为问题在于我的设置,因为我使用 sqlite3。

但一定有别的东西...当我启动服务器时,命令提示符显示MessagesChannel is streaming from conversation_ 而应该是conversation_1

当我尝试发送消息时,命令提示符会显示以下内容

No template found for MessagesController#create rendering head :no_content

我的messages_channel.rb

class MessagesChannel < ApplicationCable::Channel
  def subscribed
    stream_from "conversation_#{params[:id]}"
  end
end

我的消息.coffee

$(() ->
App.messages = App.cable.subscriptions.create {channel: 'MessagesChannel', id: $('#conversation_id').val() },
  received: (data) ->
    $('#new_message')[0].reset()
    $('#chat').prepend data.message
)

消息控制器

class MessagesController < ApplicationController
  before_action :authenticate_user!
  before_action :set_conversation

  def index
    if current_user == @conversation.sender || current_user == @conversation.recipient
      @other = current_user == @conversation.sender ? @conversation.recipient : @conversation.sender
      @messages = @conversation.messages.order("created_at DESC")
    else
      redirect_to conversations_path, alert: "You don't have permission."
    end
  end

  def create
    @message = @conversation.messages.new(message_params)
    @messages = @conversation.messages.order("created_at DESC")

    if @message.save
      ActionCable.server.broadcast "conversation_#{@conversation.id}", message: render_message(@message)
      redirect_to conversation_messages_path(@conversation)
    end
  end


  private

  def render_message(message)
    self.render(partial: 'messages/message', locals: {message: message})
  end

  def set_conversation
    @conversation = Conversation.find(params[:conversation_id])
  end

  def message_params
    params.require(:message).permit(:context, :user_id)
  end
end

消息视图 index.html.erb

<div class="container-small">
  <div class="row">
    <div class="col-md-3 text-center">
      <%= image_tag avatar_url(@other), class: "img-circle avatar-medium" %>
      <strong><%= @other.fullname %></strong>
      <%= link_to "Profil Ansehen", @other, class: "btn btn-default" %>
    </div>
    <div class="col-md-9">
      <div class="panel panel-default">
        <div class="panel-heading">
          Chat mit <%= @other.fullname %>
          <input id="conversation_id" type="hidden" value="<%= @conversation.id %>">
        </div>
        <div class="panel-body">
          <div class="container text-center">
            <%= form_for [@conversation, @conversation.messages.new], remote: true do |f| %>
              <div class="form-group">
                <%= f.text_field :context, placeholder: "Deine Nachricht", class: "form-control" %>
              </div>
              <%= f.hidden_field :user_id, value: current_user.id %>
              <div>
                <%= f.submit "Absenden", class: "btn btn-normal" %>
              </div>
            <% end %>
          </div>
        </div>
      </div>
        <div id="chat">
          <%= render @messages %>
        </div>
    </div>
  </div>
</div>

连接.rb

module ApplicationCable
  class Connection < ActionCable::Connection::Base
  end
end

【问题讨论】:

  • 请发布您的connection.rb 文件
  • 添加了 connection.rb 文件。

标签: ruby-on-rails ruby-on-rails-5 actioncable


【解决方案1】:

哦!你错过了连接,所以你应该像这样配置连接文件

module ApplicationCable
    class Connection < ActionCable::Connection::Base
        identified_by :current_user

        def connect
            self.current_user = find_verified_user
        end

        protected

        def find_verified_user
            if (current_user = env['warden'].user) //Devise authentication
                current_user
            else
                reject_unauthorized_connection
            end
        end
    end
end

这是我做了一个作弊应用see this

【讨论】:

  • 谢谢,但这不起作用。我仍然收到相同的错误,并且消息未保存到数据库中。它仍在从对话中流式传输_
  • 好的,别灰心,我认为问题出在某个地方,但第一阶段是在工作电缆之前配置连接
  • 您可以按照 repo 重构您的概念,我将其发布在我的答案中
  • 我设法调试了应用程序,问题仍然存在,但现在只有第一条记录保存到数据库中。第一条消息之后的每条消息都不会保存。它总是引用messages_controller.rb,因为render 和redirect_to 在同一个方法中被调用。所以我删除了redirect_to,但我仍然面临记录没有保存到数据库中的问题......
猜你喜欢
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
  • 2016-09-21
  • 2012-08-30
  • 2011-01-19
  • 1970-01-01
相关资源
最近更新 更多