11

当我尝试访问我的一个页面时出现以下错误

ActiveRecord::StatementInvalid (Mysql2::Error: Table 'p478r679_partybot.secretsanta' 不存在: SHOW FIELDS FROM 'secretsanta'): app/controllers/secretsantas_controller.rb:7:in `index'

但是这个表存在于我的数据库中。

只是为了让您了解我的问题的背景,几年前我编写了这个应用程序,直到最近它都运行良好。当我尝试使用瘦服务器启动应用程序时,出现以下错误

你已经激活了 rack 1.4.3,但是你的 Gemfile 需要 rack 1.2.1。使用 bundle exec 可以解决这个问题。(宝石::加载错误)

因此,我向托管服务的技术支持寻求帮助。他们说,

“问题在于 rails 版本与 bundler 版本不兼容。现在我们已将 rails 版本更改为“3.1.10”并安装了捆绑程序“1.2.3”。现在您的网站加载正常。“瘦”服务已在您的服务器中启动。该端口正在侦听应用程序。请参阅下面给出的详细信息。”

他们已经更新了我所有的宝石以使其正常工作。我最初使用的是 Rails 3.0.1 和 Thin 1.2.7。现在我有 Rails 3.1.10 和 Thin 1.5.1。现在应用程序正在加载,所有功能都在工作,除了 Secretsanta。

当我仔细查看错误消息的以下部分“SHOW FIELDS FROM secretsanta”时,我看到表名是“secretsanta”,应该是“secretsanta s ”吗?

我不知道该怎么做,毕竟该应用程序在过去 3 年中运行良好,而且我不确定为什么在更新 gems 后它无法正常工作

这是 Secretsanta 模型 User 模型和 SecretsantasController 的一些代码片段。

秘密圣诞老人.rb

   class Secretsanta < ActiveRecord::Base
     belongs_to :user
     belongs_to :gift_receiver, :class_name => "User"
     ...

用户.rb

    class User < ActiveRecord::Base

      # Setup accessible (or protected) attributes for your model
      attr_accessible :first_name, :last_name, :email,
                      :password, :password_confirmation, :remember_me

      validates :first_name, :presence => true
      validates :last_name, :presence => true
      validate :should_be_invited

      # Include default devise modules. Others available are:
      # :token_authenticatable, :confirmable, :lockable and :timeoutable
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :trackable, :validatable

      has_one :potluck

      has_one :secretsanta
      has_one :gift_receiver, :through => :secretsanta

      has_many :secretsantaExclutions
      has_many :excluded, :through => :secretsantaExclutions

      has_many :discussions
      has_many :comments
      ...

secretsantas_controller.rb

    class SecretsantasController < ApplicationController
      before_filter :authenticate_user!
      def index
        @exclutionList = SecretsantaExclution.find_all_by_user_id(current_user.id)
        @event = Event.find_by_id(4)
        @rsvp = GuestList.find_by_guest(current_user.email)
        @secretsanta = Secretsanta.find_by_user_id(current_user.id) #i am getting the error at this line

      end

如果您需要其他信息,请告诉我。提前感谢您的帮助

4

1 回答 1

20

我相信您对 secretsanta 表名的怀疑是正确的。

除非您在 secretsanta 模型上设置了 table_name,否则 rails 会查找名为secretsantas. 如果该应用程序以前可以工作,我猜该表实际上是命名的secretsantas

要列出可用的表,请运行:

tables = ActiveRecord::Base.connection.tables

啊,问题来了:

'Secretsanta'.pluralize
=> "Secretsanta"

尝试在模型中指定表名:

class Secretsanta < ActiveRecord::Base
  self.table_name = "secretsantas"
end
于 2013-11-12T18:54:47.327 回答