11

自分のページにアクセスしようとすると、次のエラーが表示されます

ActiveRecord::StatementInvalid (Mysql2::エラー: テーブル 'p478r679_partybot.secretsanta' は存在しません: 'secretsanta' からフィールドを表示): app/controllers/secretsantas_controller.rb:7:'index' 内

しかし、このテーブルは私のDBに存在します。

私の問題の背景を説明するために、私はこのアプリケーションを数年前に作成しましたが、最近まで問題なく動作していました。Thin Server でアプリケーションを起動しようとすると、次のエラーが発生しました。

すでにラック 1.4.3 を有効にしていますが、Gemfile にはラック 1.2.1 が必要です。bundle exec を使用すると、これを解決できる場合があります。(宝石::ロードエラー)

そこで、ホスティング サービスの技術サポートに支援を求めました。彼らは言った、

「問題は、レールのバージョンがバンドラーのバージョンと互換性がないことでした。これで、レールのバージョンが「3.1.10」に変更され、バンドラー「1.2.3」がインストールされました。これで、Web サイトが正常に読み込まれます。サーバーで「シン」サービスが開始されます。ポートはアプリケーションをリッスンしています。以下の詳細を参照してください。」

そして、彼らはそれを機能させるために私の宝石をすべて更新しました。私はもともと 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 年間正常に動作していたにもかかわらず、gem を更新した後に動作しない理由がわかりません。

Secretsanta モデル User モデルと SecretsantasController のコード スニップを次に示します。

Secretsanta.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 に答える