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')

应该通过 Factory Girl 的界面强制执行关联。

于 2013-03-21T10:09:23.693 回答
1

attr_accessible我相信你或attr_accessor你的Article班级发生了什么事。我你可能没有包括user_id或其他东西......

这里也有一个类似的问题:rails Model.create(:attr=>"value") returns model with uninitialized fields

于 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 回答