2

私は本当にこれを理解することができないので、私はただこれをそこに投げています。たとえば、呼び出すとuser.articles.create! { title: 'blah' }nilが返されますが、オブジェクトは作成されます。私はこれまでこのようなものを見たことがなく、他の誰かが持っているかどうか疑問に思っていましたか?

Rails 3.2.13と3.2.12を試しましたが、どちらも同じことをします。

編集

アクティブレコードでは、作成と作成の両方を行います。レコードを返すか、例外をスローすることになっているこのメソッドで終了します。

def create_record(attributes, options, raise = false, &block)
  unless owner.persisted?
    raise ActiveRecord::RecordNotSaved, "You cannot call create unless the parent is saved"
  end

  if attributes.is_a?(Array)
    attributes.collect { |attr| create_record(attr, options, raise, &block) }
  else
    transaction do
      add_to_target(build_record(attributes, options)) do |record|
        yield(record) if block_given?
        insert_record(record, true, raise)
      end
    end
  end
end
4

4 に答える 4

2

私が間違っていない場合、 Factory Girlは、事前定義されたファクトリを介して処理している実際のオブジェクトを模倣します。そのためUser#articles、工場に呼ばれたときに思った通りに戻らない場合があります。

変化

user.articles.create! { title: 'blah' }

create(:article, user: user, title: 'blah')

FactoryGirlのインターフェースを介して関連付けを実施する必要があります。

于 2013-03-21T10:09:23.693 に答える
1

attr_accessibleあなたやattr_accessorあなたのArticleクラスで何かが起こっていると思います。user_id私はあなたが何か他のものを含めなかったかもしれません...

ここにも同様の質問があります:rails Model.create(:attr => "value")は、初期化されていないフィールドを持つモデルを返します

于 2013-03-21T09:54:36.823 に答える
1

私は同じ症状を持っていました、そしてこの質問は私が見つけることができた唯一の関連するヒットです。他の誰かに役立つ場合に備えて、ソリューションをミックスに投入します。

コードは実際に機能し、で失敗しただけrspecです。私が行ったすべてのトラブルシューティングは意味がなく、create!壊れていることを示していましたが、信じられませんでした。

結局のところ、私はあざけっcreate!ていたので、呼ばれることはありませんでした。私のモックに追加.and_call_originalすると、問題が解決しました。

私のモデルは次のようなものでした:(実際には...しかしこの回答と互換性があります)

class Flight < ApplicationRecord
  has_many :seats

  def create_seats(seat_count)
    seat_count.times { Seat.create!(flight: self) }
    seats.each(&:raise_seatback_and_lock_tray)
  end

そして私のテストは:

it 'creates enough empty seats' do
  expect(LicenseFile).to receive(:create!).twice
  flight.create_seats(2)
end

期待は満たされましたが(手動で確認)、エラーが発生しました:

 NoMethodError:
   undefined method `raise_seatback_and_lock_tray=' for nil:NilClass

実際に呼び出せるようにモックを変更するcreate!と、問題が解決しました。

it 'creates a LicenseFile for each destination rule' do
  expect(LicenseFile).to receive(:create!).twice.and_call_original
  flight.create_seats(2)
end

これは今合格しました:

    creates enough empty seats
1 example, 0 failures
于 2021-02-17T15:29:47.580 に答える
-1

オブジェクトが返されることを期待している場合は、

user.articles.create { title: 'blah' }

一部のメソッドに強打(!)があるのはなぜですか、このトピックを読むことができます なぜRubyメソッドで感嘆符が使用されているのですか?

于 2013-03-21T09:43:05.493 に答える