2016-06-10 41 views
1

我有附件和類別模型,因此當用戶上傳文件時,他們可以爲該附件選擇一個類別。我希望類別現在是靜態的。有關如何創建靜態類別模型選項的建議? 我現在有這個權利,但我得到了以下錯誤:undefined method 'title' for Syllabus":StringRails模型常量

類別型號

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

你似乎想有分類的固定名單,然而,大概是爲將來的擴展,你想指那些通過belongs_tocategory_idattachments模型。您無法事先知道您的數據庫引擎或其他任何人可能將什麼category_id值分配給類別對象,他們是否要真實創建它們。

由於collection_select期望您提供的集合包含實際類別模型實例,該實例具有類似#title的方法,因此會產生相關數據庫表屬性。相反,你正試圖給它一個字符串數組。

因此,您應該使用種子數據 - 谷歌的「軌道4種子數據」的東西,以瞭解該怎麼做。使用種子數據,您實際上會創建該類別模型的實際數據庫實例,該實例將在應用程序安裝階段中加載。該模型在您的應用程序的早期版本中不會有任何編輯/管理界面,但它的實際實例仍然存在於數據庫中。

[編輯:我一般喜歡rake db:create db:migrate方法造就了應用程序,因爲db:schema:load可能並不總是可行的,特別是如果深奧的ID列結構發生了遷移文件,其中schema.rb摘要文件可能沒有準確的記錄,由於Rails的錯誤。因此,我更願意用我在一個非常古老的StackOverflow問題的答案所描述的方法 - Add Rows on Migrations - 但情況因人而異,你可能更喜歡的東西,而不是seeds.rb]