代码之家  ›  专栏  ›  技术社区  ›  Amer Bearat

使用ruby on rails操作电缆发送实时消息时出错

  •  0
  • Amer Bearat  · 技术社区  · 7 年前

    我正在构建文本消息系统,该系统将保存到sqlite,我得到的错误来自代码。创建新邮件时,我收到此错误

    ActiveRecord::StatementInvalid (SQLite3::BusyException: database is locked: INSERT INTO "notifications" ("content", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)):
    ActiveRecord::StatementInvalid (SQLite3::BusyException: database is locked: commit transaction): 
    

    如果我删除此行

    ActionCable.server.broadcast "conversation_#{@conversation.id}", message: render_message(@message)
    

    来自应用程序/控制器/消息\u控制器。rb型

    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 to view this."
        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
    

    我需要去掉这个部分 ,远程:true 从此行开始

    <%= form_for [@conversation, @conversation.messages.new], remote: true do |f| %>
    

    来自应用程序/视图/消息/索引。html。雇员再培训局

      <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: "Add a personal message", class: "form-control" %>
              </div>
              <%= f.hidden_field :user_id, value: current_user.id %>
              <div>
                <%= f.submit "Send Message", class: "btn btn-normal" %>
              </div>
          <% end %>
        </div>
      </div>
    

    如果我删除了最上面的两行,消息将工作并保存到数据库中,但我不会在接收方进行实时更新,下面是我代码的其他部分

    应用程序/资产/javascripts/频道/消息。咖啡

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

    应用程序/频道/消息\u频道。rb型

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

    最后,这一个应用程序/视图/对话/索引。html。雇员再培训局

         <div class="container">
          <% @conversations.each do |conversation| %>
              <% other = current_user == conversation.sender ? conversation.recipient : conversation.sender %>
              <%= link_to conversation_messages_path(conversation) do %>
                  <div class="row conversation">
                    <% if conversation.messages.any? %>
                        <div class="col-md-2">
                          <%= image_tag avatar_url(other), class: "img-circle avatar-medium" %>
                        </div>
                        <div class="col-md-2">
                          <%= other.fullname %>
                          <%= conversation.messages.last.message_time %>
                        </div>
                        <div class="col-md-8">
                          <%= conversation.messages.last.context %>
                        </div>
                    <% end %>
                  </div>
              <% end %>
          <% end %>
        </div>
    

    这里是配置/数据库。yml公司

    default: &default
       adapter: sqlite3
       pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 30 } %>
       timeout: 30000
    development:
       <<: *default
       database: db/development.sqlite3
    test:
       <<: *default
       database: db/test.sqlite3
    production:
       <<: *default
       database: db/production.sqlite3
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   lacostenycoder    7 年前

    Sqlite3的并发性支持较差,因此将DB切换到更健壮的后端MySQL或Postgres。