2013-07-23 3 views
1

После выполнения Rails 4.0 supplement, я добрался до Some specific issues части, где Майкл упоминаетDUP метод не работает после переноса Rails 3.2 → 4.0

Одно крошечное изменение в спецификации Micropost (spec/models/micropost_spec.rb) является изменение от dup метод (чтобы дублировать пользовательские микропосты пользователя) на метод to_a (который преобразует их в массив). Вот версия с dup:

Rails 3,2

it "should destroy associated microposts" do 
    microposts = @user.microposts.dup 
    @user.destroy 
    microposts.should_not be_empty 
    microposts.each do |micropost| 
    Micropost.find_by_id(micropost.id).should be_nil 
    end 
end 

Rails 4,0

it "should destroy associated microposts" do 
    microposts = @user.microposts.to_a 
    @user.destroy 
    expect(microposts).not_to be_empty 
    microposts.each do |micropost| 
    expect(Micropost.where(id: micropost.id)).to be_empty 
    end 
end 

Он сам говорит, что он не полностью понимает необходимость изменения метода :

По причинам, не вызывающим меня, звонок dup больше не работает в Rails 4.0, но заменяет его to_a работает отлично.

Так почему же dup больше не работает?

+0

Интересно, что после того, как я разместил этот вопрос, тест действительно не прошел. Пробовал использовать 'microposts = @ user.microposts.dup.to_a', и это сработало! – gregoltsov

ответ

2

Как обсуждалось в http://edgeguides.rubyonrails.org/4_0_release_notes.html#general, Model.all теперь возвращает ActiveRecord::Relation, а не Array. Хотя Relation поддерживает многие из методов, которые делает Array (например, each), он не поддерживает empty?. to_a преобразует его в Array, так что пустые тесты могут функционировать.

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