Неизвестный атрибут: user_id

Я получаю неизвестный атрибут ошибки: user_id запускает выполнение current_user.stories.build

class User < ActiveRecord::Base
  has_many :stories, class_name: 'Story', foreign_key: 'user_id', dependent: :destroy
  ...

class Story < ActiveRecord::Base
  belongs_to :user, class_name: 'User', foreign_key: 'user_id'
  ...

schema.rb

create_table "stories", :force => true do |t|
    t.string   "responsible"
    t.string   "descr"
    t.string   "state"
    t.datetime "created_at",  :null => false
    t.datetime "updated_at",  :null => false
  end

  create_table "users", :force => true do |t|
    t.string   "email"
    t.string   "password_digest"
    t.datetime "created_at",      :null => false
    t.datetime "updated_at",      :null => false
    t.string   "name"
  end

Он не содержит поля user_id. Любые идеи?

Ответ 1

Kulbir правильно, что вам нужно определить столбец user_id в вашей таблице stories, но не объясняет, как это сделать.

Правильный способ сделать это изменение - создать новую миграцию. По соглашению он должен называться add_user_id_to_stories и будет создан следующим образом (если вы используете Rails 3 +):

rails generate migration add_user_id_to_stories

Если вы запустите это, он должен фактически создать миграцию, которая уже содержит изменения, которые вам нужно внести, что должно быть примерно так:

add_column :stories, :user_id, :integer

В стороне, когда вы следуете соглашениям Rails об именах ассоциаций, которыми вы являетесь, вы можете фактически пропустить большую часть дополнительной спецификации. В модели User вы можете указать только has_many :stories и в модели Story указать belongs_to :user. Rails будет использовать те же имена классов и внешние ключи, которые вы указали.

Ответ 2

У вас должно быть поле user_id в вашей таблице stories, как показано ниже, чтобы определить ассоциацию в ваших моделях.

create_table "stories", :force => true do |t|
    t.integer  "user_id"
    t.string   "responsible"
    t.string   "descr"
    t.string   "state"
    t.datetime "created_at",  :null => false
    t.datetime "updated_at",  :null => false
  end
  ...
end

Забастовкa >

Edit

Проверьте ответы Эмили для подробного объяснения.

Ответ 3

вы должны использовать новый синтаксис и передать тип поля как символ

add_column :stories, :user_id, :integer