2016-06-10 4 views
1

У меня есть вложения и категории, поэтому, когда пользователь загружает файл, они могут выбрать категорию для этого приложения. Я хочу, чтобы категории были статичными. Совет о том, как создавать статические параметры модели модели? У меня есть это прямо сейчас, но я получаю следующее сообщение об ошибке: undefined method 'title' for Syllabus":StringRails Model Constants

Категория Модель

class Category < ActiveRecord::Base 
    CATEGORY = ['Syllabus', 'Assignments', 'Handouts', 'Lectures', 'Other'] 
    has_many :attachments 
end 

Attachment 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_to и category_id в attachments модели. Вы не можете заранее знать, что значение category_id означает, что ваш механизм базы данных или кто-либо еще может назначить объекты категории, которые они должны были быть созданы для реального.

У вас возникла ошибка, потому что collection_select ожидает, что коллекция, которую вы даете ей, состоит из реальных экземпляров модели категорий, которые имеют методы, такие как #title, связанные с атрибутами соответствующей базы данных базы данных. Вместо этого вы пытаетесь просто дать ему массив строк.

Таким образом, вы должны использовать данные о семенах - Google для чего-то вроде «рельсов 4 семенных данных», чтобы получить представление о том, что делать. Имея данные о семенах, вы фактически создадите реальные экземпляры базы данных этой модели категории, которые загружаются как часть фазы установки вашего приложения. У модели просто нет интерфейса редактирования/управления в ранних версиях вашего приложения, но реальные экземпляры его будут в базе данных тем не менее.

[Edit: я вообще предпочитаю rake db:create db:migrate подход к воспитывающим приложений, так как db:schema:load не всегда может работать, особенно если эзотерический ID столбцов конструкции произошли в миграции файлов, которым schema.rb Сводный файл не может быть точно записаны в связи с Rails ошибок , Соответственно, я предпочитаю использовать подход, который я описал в ответ очень старый StackOverflow вопрос, по - Add Rows on Migrations - но YMMV, вы можете предпочесть что-то вроде seeds.rb вместо]

0

Кажется мне, что Category::CATEGORY должно быть перечисление.. Существует как минимум два способа добиться того, чего вы хотите:

  1. Одиночное наследование: http://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html.
  2. перечисление: http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html

Пожалуйста, спросите, если вы имеете любой вопрос с руководством.