我有附件和类别模型,因此当用户上传文件时,他们可以为该附件选择一个类别。我希望这些类别现在是静态的。有关如何创建静态类别模型选项的建议?
我现在有这个但是我收到以下错误:undefined method 'title' for Syllabus":String
类别模型
class Category < ActiveRecord::Base
CATEGORY = ['Syllabus', 'Assignments', 'Handouts', 'Lectures', 'Other']
has_many :attachments
end
附件new.html.erb
<%= simple_form_for([@group, @group.attachments.build]) do |f| %>
<%= f.collection_select :category_id, Category::CATEGORY, :id, :title, { promt: "Choose a Category" } %>
<%= f.submit %>
<% end %>
附件模型
class Attachment < ActiveRecord::Base
belongs_to :user
belongs_to :group
belongs_to :category
end
模式
create_table "categories", force: :cascade do |t|
t.string "title"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "attachments", force: :cascade do |t|
t.string "title"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
t.string "name"
t.integer "group_id"
t.integer "category_id"
end
答案 0 :(得分:0)
您似乎希望拥有一个固定的类别列表,但可能是为了将来扩展,您希望通过belongs_to
模型中的category_id
和attachments
来引用这些类别。您无法预先知道数据库引擎或其他任何人可能分配给类别对象的category_id
值是否为真实创建。
您收到错误是因为collection_select
期望您提供的集合由真实的Category模型实例组成,这些实例具有来自关联数据库表的属性的#title
等方法。相反,你试图给它一个字符串数组。
因此,您应该使用种子数据 - 谷歌的“rails 4种子数据”之类的东西,以了解该做什么。使用种子数据,您实际上将创建该类别模型的真实数据库实例,这些实例将作为应用程序安装阶段的一部分加载。该模型在应用程序的早期版本中不会有任何编辑/管理界面,但它的实际实例仍将在数据库中。
[编辑:我通常更喜欢rake db:create db:migrate
方法来启动应用程序,因为db:schema:load
可能并不总是有效,特别是如果迁移文件中出现了深奥的ID列结构,schema.rb
由于Rails错误,摘要文件可能没有准确记录。因此,我更喜欢使用我在一个非常古老的StackOverflow问题答案中描述的方法 - Add Rows on Migrations - 但是YMMV,您可能更喜欢seeds.rb
之类的东西。]
答案 1 :(得分:0)
我觉得Category::CATEGORY
应该是枚举。至少有两种方法可以达到你想要的效果: