2013-11-02 4 views
0

Мой код выглядит так:Невозможно записать неизвестный атрибут `challenge_id»

routes.rb

resources :challenges do 
    resources :problems 
end 

приложение/модели/challenge.rb

class Challenge < ActiveRecord::Base 
    has_many :problems 
end 

приложение/модели/problem.rb

class Problem < ActiveRecord::Base 
    belongs_to :challenge 
end 

db/migrate/createchallen ges.db

class CreateChallenges < ActiveRecord::Migration 
    def change 
    create_table :challenges do |t| 
     t.string :name 
     t.timestamps 
    end 
    end 
end 

дб/мигрирует/createproblems.rb

class CreateProblems < ActiveRecord::Migration 
    def change 
    create_table :problems do |t| 
     t.belongs_to :challenge 
     t.string :description 
     t.timestamps 
    end 
    end 

конец

приложение/контроллеры/problem_controller.rb

class ProblemsController < ApplicationController 
    def new 
     @challenge = Challenge.find(params[:challenge_id]) 
     @problem = Problem.new(:challenge => @challenge) 
    end 
end 

Я могу создать "вызов" без проблем, но когда я создаю новую «проблему», я получил ошибку:

can't write unknown attribute `challenge_id' 

На линии

@problem = Problem.new(:challenge => @challenge) 

Что может быть причиной этой ошибки?

ответ

1

При создании таблицы БД для вашей модели, которая имеет belong_to, использовать references:

create_table :problems do |t| 
    t.references :challenge 
    t.string :description 
    t.timestamps 
end 

Кроме того, вы можете проверить, база данных настроена правильно, глядя на db/schema.rb.

Не забудьте запустить миграцию, простую, но я сам забыл.

+0

Ошибка все тот же. И db/schema.rb, похоже, не создает «challenge_id». Нужно ли мне создать новую миграцию, чтобы добавить этот новый столбец, или если рельсы позаботятся об этом? –

+0

Просто, чтобы сообщить вам: я не забыл запустить миграцию :) –

+0

Если вы уже выполнили миграцию, вы не можете внести в нее изменения и повторить эту миграцию. Я бы рекомендовал: 1. удалить/воссоздать/перенести, 2. создать новую миграцию, добавить ссылки: вызов или 3. unmigrate (иначе он удалит таблицу), а затем изменить миграцию и ремигрировать. –

Смежные вопросы