【问题标题】:Access Database/Model Objects During Assets Precompile在资产预编译期间访问数据库/模型对象
【发布时间】:2019-10-08 01:00:58
【问题描述】:

我正在尝试将我的 rails 聊天应用程序部署到 Heroku,但我的 javascript 在资产预编译期间无法调用数据库。推送失败并显示 “预编译资产失败。”

循迹寻踪

remote:        Caused by:
remote:        PG::UndefinedTable: ERROR:  relation "chatrooms" does not exist
remote:        LINE 1: SELECT "chatrooms".* FROM "chatrooms"

经过一番调查,我发现Chatroom.all.each是什么造成了麻烦。

频道(客户端):

// my-app/app/assets/javascripts/channels/chatroom.js.erb

//Iterate through chatrooms
<% Chatroom.all.each do |chatroom| %>

  App['chatroom' + <%= chatroom.id %>] = App.cable.subscriptions.create({channel: "ChatroomChannel", room: <%= chatroom.id %>},{    

      received: function(data) {
          ...
      };

  });

<% end %>

所以我在预编译期间似乎无法访问 Chatroom 模型。我需要在我的 production.rb 文件中添加什么内容吗?该应用程序在我的本地环境中运行良好。

【问题讨论】:

  • 当您“尝试在 Heroku 上重置数据库”时,您做了什么?
  • 我在终端输入了$ heroku pg:reset,然后是$ heroku run rails db:migrate
  • 听起来好像它试图在创建聊天室之前创建 chatroom_users。您是否仔细检查过您的迁移没有出现问题?
  • 它们看起来顺序正确。从最早到最新的时间戳,我的迁移是:create_users.rbcreate_messages.rbcreate_chatrooms.rbcreate_chatroom_users.rb 和 add_chatroom_id_to_users.rb.

标签: ruby-on-rails postgresql heroku


【解决方案1】:

资产预编译时似乎无法访问数据库。

我通过将聊天室 ID 存储在 HTML5 数据属性中并使用 jQuery 遍历它们来解决这个问题。

// my-app/app/assets/javascripts/channels/chatroom.js.erb

$(document).on('turbolinks:load', () => {

  //Iterate through chatrooms
  $('.message-container').each(function() {

    App[`chatroom${$(this).data('chatroom_id')}`] = App.cable.subscriptions.create({channel: "ChatroomChannel", room: String($(this).data('chatroom_id'))},{

      received: function(data) {
        ...
      }

    });
  });
})

不过,我对其他解决方案持开放态度!

【讨论】:

    猜你喜欢
    • 2012-07-28
    • 2013-10-23
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    相关资源
    最近更新 更多