Rails模型常量

时间:2016-06-10 01:02:20

标签: ruby-on-rails

我有附件和类别模型,因此当用户上传文件时,他们可以为该附件选择一个类别。我希望这些类别现在是静态的。有关如何创建静态类别模型选项的建议? 我现在有这个但是我收到以下错误: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

2 个答案:

答案 0 :(得分:0)

您似乎希望拥有一个固定的类别列表,但可能是为了将来扩展,您希望通过belongs_to模型中的category_idattachments来引用这些类别。您无法预先知道数据库引擎或其他任何人可能分配给类别对象的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应该是枚举。至少有两种方法可以达到你想要的效果:

  1. 单表继承:http://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html
  2. enum:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html
  3. 请问您是否对指南有任何疑问。