Rail 3.2.2/Devise: предупреждение об устаревании с rspec

Недавно я обновил приложение до рельсов 3.2.2.

Я использую Factory_girl

Factory.sequence: name do | n | "name - # {n}" end

Factory.define: user do | u | u.first_name { Factory.next(: name)}
u.last_name {| u | 'last_' + u.first_name} u.password 'secret'
u.password_confirmation {| u | u.password} u.sequence(: email) {| я | "user_#{i}@example.com" }

конец

и этот простой тест

укажите {Factory.build(: user).should be_valid}

вывести следующее предупреждение

DEPRECATION WARNING: вы пытаетесь создать атрибут user_id'. Writing arbitrary attributes on a model is deprecated. Please just use attr_writer` и т.д. (вызывается из блока (2 уровня) в на...

Как я могу избавиться от него?

Ответ 1

Вероятно, потому, что вы не подготовили/не перенесли тестовую базу данных с обновленными определениями столбцов, поэтому она думает, что вы пытаетесь произвольно установить атрибут.

Запустите rake db:test:prepare, чтобы убедиться, что он обновлен.

Здесь исходный код этого метода, где вы можете видеть, что Rails сначала проверяет столбец или атрибут, а затем предупреждает, если они не найдены.

Ответ 2

Я встретил такое же предупреждение со следующим кодом:

Модель объявления:

class Ad < ActiveRecord::Base
    belongs_to :user
end

Фабрики:

FactoryGirl.define do 
    factory :ad do
        association :user
    end
end

FactoryGirl.define do 
    factory :user do
        first_name {Factory.next(:first_name)}
        last_name {Factory.next(:last_name)}
        email {|x| "#{x.first_name}.#{x.last_name}#{Factory.next(:count)}@test.com"}
        password Forgery(:basic).password
        confirmed_at Date.today << 10
    end
end

Тест

require 'spec_helper'

describe Ad do
    before(:each) do
        @ad = Factory.build(:ad)
    end

    "it is not valid without a user"
end

Запуск теста дал мне аналогичную ошибку.

Добавление

attr_accessor :user

для модели объявления установлено предупреждение.

Надеюсь, это поможет.

Ответ 3

У меня было это же предупреждение при выполнении тестов в Rspec, и моя проблема заключалась в том, что у меня была модель родителя и модель Child, где у меня это было случайно:

class Child < ActiveRecord::Base
  belongs_to :parent
end

......

class Parent < ActiveRecord::Base
  belongs_to :child
end