Создание выпадающего поля категории в Ruby on Rails с использованием вложенных форм и has_many :through

Редактировать: похоже, что повторное определение @categories в методе create задачи помогло устранить ошибку. Все еще работаю над обновлением категории, когда я отправляю задачу, потому что сейчас она ее игнорирует. Есть идеи?

Всем привет,

Я пытаюсь создать раскрывающийся список в своем первом проекте Rails, чтобы выбрать из списка категорий задачу. Я использовал модель категоризации, чтобы связать модель задачи с категорией.

После некоторых усилий я получил раскрывающийся список, чтобы он правильно отображался в новой форме задачи, но когда я нажимаю «Отправить», форма выдает следующую ошибку:

NoMethodError in Tasks#create

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.map

Любая помощь, которую вы могли бы предоставить, очень ценится. Вот код, который я использую (отрывок для краткости)...

Соответствующая часть моей новой формы задачи (HAML):

= f.fields_for :categorization do |sub|
    = sub.label :name, 'Category'
    = sub.collection_select(:category_id, @categories, :id, :name, :include_blank => 'Select a Category')

tasks_controller.rb:

def new
    @task = Task.new
    @categories = Category.all
end

def create
    @task = current_user.tasks.build(params[:task])
    if @task.save
        flash[:success] = "Task created!"
        redirect_to root_path
    else
        render 'new'
    end
end

categorization.rb:

class Categorization < ActiveRecord::Base
    belongs_to :task
    belongs_to :category

    validates :task_id, :presence => true
    validates :category_id, :presence => true
end

category.rb:

class Category < ActiveRecord::Base
    has_many :categorizations, :dependent => :destroy
    has_many :tasks, :through => :categorizations

    validates :name, :presence => true
end

task.rb

class Task < ActiveRecord::Base
    attr_accessible :title, :body

    has_many :categorizations, :dependent => :destroy
    has_many :categories, :through => :categorizations

    accepts_nested_attributes_for :categorizations

    validates :title, :presence => true
    validates :body, :presence => true
end

routes.rb:

resources :tasks

resources :categories do
    member do
        get :tasks
    end
end

Какие-нибудь мысли? Большое спасибо, что заглянули, и дайте мне знать, если вам нужно что-то еще, чтобы помочь.

Хайдн


person Haidn Foster    schedule 13.03.2011    source источник


Ответы (2)


Я думаю, вам нужно будет добавить следующую строку в ваш categorization.rb:

attr_accessible :category_id

Без этой строки вы не можете установить category_id в методе сборки, который вы используете в tasks_controller.rb.

Дайте мне знать, если это исправит это для вас!

person Rob d'Apice    schedule 13.03.2011
comment
Извиняюсь: здесь слепой ведет слепого. Учитывая, что у вас нет вызова attr_accessible, все атрибуты доступны, поэтому мой совет, безусловно, не является решением. Однако я только что заметил одну вещь: include_blank => 'Select a Category' должно быть {include_blank => 'Select a Category'}. Однако не уверен, что это решит вашу проблему. - person Rob d'Apice; 13.03.2011
comment
Привет @Rob, к сожалению, фигурные скобки не изменили функциональность, и вы правы, видя, что на данный момент у меня нет никаких атрибутов attr_accessible. Но я ценю усилия! Дайте мне знать, если вы думаете о чем-то еще. - person Haidn Foster; 13.03.2011

Хорошо, я собираюсь попытаться выяснить, как правильно реализовать сохранение самостоятельно, но я обнаружил решение своей первоначальной проблемы, которая снова объявляла @categories в моем методе создания задачи. Надеюсь, это поможет кому-то!

person Haidn Foster    schedule 13.03.2011