当我尝试访问其中一个页面时出现以下错误
ActiveRecord :: StatementInvalid(Mysql2 ::错误:表'p478r679_partybot.secretsanta'不存在:显示来自'secretsanta'的字段): app / controllers / secretsantas_controller.rb:7:在`index'
但是这个表存在于我的数据库中。
为了给你一个问题的背景,几年前我写了这个应用程序,直到最近才开始工作。当我尝试使用瘦服务器启动应用程序时,出现以下错误
您已经激活了机架1.4.3,但您的Gemfile需要机架1.2.1。使用bundle exec可以解决这个问题。 (GEM :: LoadError)
所以我从托管服务处寻求技术支持以寻求帮助。他们说,
“问题是rails版本与bundler版本不兼容。现在我们已将rails版本更改为“3.1.10”并已安装捆绑器“1.2.3”。现在您的网站正在加载正常。“瘦”服务在您的服务器中启动。端口正在侦听应用程序。请参阅下面给出的详细信息。“
他们已经更新了我的所有宝石以使其正常运行。我最初使用的是Rails 3.0.1和瘦1.2.7。现在我有Rails 3.1.10和瘦1.5.1。现在应用程序正在加载,所有功能都在运行,但Secretsanta除外。
当我仔细查看错误消息的以下部分时,“显示来自秘密的字段”我看到表名是“secretsanta”,它应该是“secretsanta s ”吗?
我不知道该怎么做,毕竟应用程序在过去3年里工作正常,我不确定为什么它在更新宝石后无效
以下是Secretsanta模型用户模型和SecretsantasController的一些代码片段。
Secretsanta.rb
class Secretsanta < ActiveRecord::Base
belongs_to :user
belongs_to :gift_receiver, :class_name => "User"
...
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
如果您需要和其他信息,请告诉我。感谢您的帮助
答案 0 :(得分:16)
我相信你对secrettsanta牌名的怀疑是正确的。
除非您在secretsanta模型上设置table_name,否则rails将查找名为secretsantas
的表。如果应用程序之前正在运行,我猜这个表实际上名为secretsantas
。
要列出可用的表,请运行:
tables = ActiveRecord::Base.connection.tables
啊,这就是问题所在:
'Secretsanta'.pluralize
=> "Secretsanta"
尝试在模型中指定表名:
class Secretsanta < ActiveRecord::Base
self.table_name = "secretsantas"
end