所以我有一个Rails应用程序,用户可以在其中创建“提交”。现在我正在尝试添加创建文件夹的功能,以便组织提交。但是,我似乎遇到了使Folder模型正常工作的问题。我收到以下错误:
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
我的猜测是我可能错误地设置了用户,提交和文件夹之间的关系。以下是我的用户和提交模型:
submission.rb:
class Submission < ActiveRecord::Base
belongs_to :folder
belongs_to :user
attr_accessible :content, :title, :user_id
end
User.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
答案 0 :(得分: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
并重新启动。
答案 1 :(得分:1)
问题是您在这一行使用了单词order
,而不是:order
:
has_many :submissions, order => ('updated_at DESC')
order
是一种返回ActiveRecord::Relation
的方法,认为Folder.order(:id)...
。您正在尝试将返回的对象用作哈希中的键。这是你看到的错误。
答案 2 :(得分:1)
根据讨论确定,问题是提交表没有folder_id
列。 Tom生成了一个空迁移,用于将folder_id
添加到Submissions表中,从而得到一个ActiveRecord :: Relation错误。
生成一个新的迁移,将folder_id
添加到Submissions表,raking数据库,然后重新启动服务器,Tom说错误已解决。