2

所以我有一个 Rails 应用程序,用户可以在其中创建“提交”。现在,我正在尝试添加创建用于组织提交的文件夹的功能。但是,我似乎遇到了让文件夹模型工作的问题。我收到以下错误:

Unknown key: #<ActiveRecord::Relation:0x007f17cc75d498>

该错误表明它在此代码的第 21 行:

18:                 </div>
19: 
20:                 <div id="submission-list-container">
21:                     <% current_user.folders.each do |i| %>
22:                         <a href='#'>
23:                             <div id="post-container">
24:                                 <%= i.title %> <p id="created-time">Created <%= i.created_at.strftime("%e/%-m") %></p>

我使用创建了文件夹模型rails g model folder title:string,我的模型如下所示:

class Folder < ActiveRecord::Base
attr_accessible :title, :user_id

belongs_to :user
has_many :submissions, order => ('updated_at DESC')
end

我的猜测是我可能错误地设置了用户、提交和文件夹之间的关系。这是我的用户和提交模型:

提交.rb:

class Submission < ActiveRecord::Base

belongs_to :folder
belongs_to :user


attr_accessible :content, :title, :user_id


end

用户.rb:

class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable,
# :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me, :user_id,  :submissions, :folders
# attr_accessible :title, :body

has_many :submissions
has_many :folders, through: :submissions

end

我的迁移目录也如下所示:

20130523233304_create_submissions.rb
20130530064506_devise_create_users.rb
20130621002458_add_user_id_to_submissions.rb
20130709213421_add_user_id_to_folders.rb
20130710042650_add_folder_id_to_submissions.rb
20130710200424_create_folders.rb

知道有什么问题吗?这是我第一次遇到这个错误,所以我不确定我捏造了什么。

编辑 这里是文件夹和提交的 Schema.rb 表:

create_table "folders", :force => true do |t|
  t.string   "title"
  t.datetime "created_at", :null => false
  t.datetime "updated_at", :null => false
end

create_table "submissions", :force => true do |t|
  t.string   "title"
  t.text     "content"
  t.datetime "created_at", :null => false
  t.datetime "updated_at", :null => false
  t.integer  "user_id"
end

编辑 2 我的 create_folders 迁移:

class CreateFolders < ActiveRecord::Migration
def change
  create_table :folders do |t|
    t.string :title

  t.timestamps
end

结束结束

这是我的 add_folder_id_to_submissions 迁移文件:

class AddFolderIdToSubmissions < ActiveRecord::Migration
  def change
  end
end
4

3 回答 3

1

您有一些拼写错误可能(或可能不会)导致此异常:

# app/models/folder.rb
class Folder < ActiveRecord::Base
    has_many :submissions, :order => ('updated_at DESC') # note the `:` prior to `order` (denotes a symbol)
end

# app/models/user.rb
class User < ActiveRecord::Base
    has_many :folders, :through => :submissions
    # or `has_many :folders, through: submissions`
end

如果您担心某个表缺少迁移中包含的列,您可以从命令行重新运行迁移:

rake db:migrate:down VERSION=20130710042650
rake db:migrate:up VERSION=20130710042650 # runs 20130710042650_add_folder_id_to_submissions.rb

请务必在运行迁移后重新启动服务器以将新内容加载到您的环境中。

更新

要生成显式添加folder_id到提交的迁移,请运行以下命令:

rails generate migration AddFolderIdToSubmission folder_id:integer

然后,运行rake db:migrate并重新启动。

于 2013-07-10T20:34:48.547 回答
1

问题是您在这一行使用了裸词order,而不是:order,:

has_many :submissions, order => ('updated_at DESC')

order是一个返回ActiveRecord::Relation, think的方法Folder.order(:id)...。您正在尝试将该返回的对象用作哈希中的键。这是您看到的错误。

于 2013-07-10T21:29:49.840 回答
1

正如通过讨论确定的那样,问题在于提交表没有该folder_id列。Tom 生成了一个空迁移来添加folder_id到 Submissions 表,因此得到一个 ActiveRecord::Relation 错误。

在生成添加folder_id到 Submissions 表的新迁移、搜索数据库并重新启动服务器后,Tom 表示错误已解决。

查看有关数据库迁移的 Rails 指南以获取更多信息。

于 2013-07-10T21:34:43.103 回答