2016-09-17 71 views
0

我正在關注2012年6月製作的視頻教程。當時Ruby版本爲1.9.3,而Rails版本爲3。現在我正在嘗試Rails 5.0.0.1中的代碼示例。Rails 5.0.0.1:無法從控制檯創建類實例?

我們知道現在的strong parameters必須在create的操作中使用。當使用控制檯創建類的實例對象時,這也適用嗎?

在練習中,模型用戶由rails g scaffold user name movie生成。接下來的指令是rake db:migrate(當然),然後進入控制檯並創建一個用戶記錄。一切順利;創建記錄並保存所有具有值的字段。

但現在說到這裏,我的問題是關於部分:下一個命令是:

rails g scaffold car user:belongs_to condition year:integer

OK; rake db:migrate再次打開控制檯。發生這種情況時,我想創建一個汽車記錄:

>> car = Car.create(year: 2003, condition: 'ok') 
    (0.2ms) begin transaction 
    (0.1ms) rollback transaction 
=> #<Car id: nil, user_id: nil, condition: "ok", year: 2003, created_at: nil, updated_at: nil> 

沒有創建記錄!我猜想它與Rails 4和5中的strong parameters有關?

最後,這裏是我的問題:

  • 出了什麼問題?有沒有其他的方法,使用控制檯來創建?
  • 這是因爲車型的關係:belongs_to :user
  • 我知道有些寶石在引入強參數之前「模仿」一種狀態,但我寧願不使用這些;這感覺就像作弊!
+0

您沒有爲汽車指定用戶。檢查'car.errors',你會看到它爲什麼沒有保存。 –

+0

@SergioTulentsev:你是對的!我提供了一個'''id'''和'''user_id''',現在我可以創建一個新的記錄!謝謝!我認爲'''id'''會自動生成,但在這種情況下顯然不是! –

+0

此外:我不能用'''user_id''創建一個不存在的用戶! Rails在我的商店中有很多隱藏的__gems__! –

回答

2

導軌5需要belongs_to默認關聯,因爲this PR

您可以使用belongs_to :user, optional: true來指定該字段是可選的。

此外,如果您的模型無法保存,那麼查看其errors對象通常會很有幫助。

你可以通過做一些像puts car.errors這樣的事情做到這一點。

強參數不會影響您在控制檯中執行的任何操作。他們的重點是將質量分配保護從模型轉移到控制器中。

+0

有趣:我可以創建一個記錄只在現有的'''user_id''中給出,忽略所有其他參數!因爲在類中沒有定義''validates'''? 該教程(記住,從2012年)表明user_id是'''nil''',但是對於當前的Rails版本,這是不可能的... –

+0

是的,'user_id'是唯一必需的字段,因爲你不'對「Car」車型沒有任何其他驗證。如果通過執行'optional:true'位使'user_id'字段可選,那麼您將能夠創建一個不帶參數的新'Car',如:'car = Car.create!'和'car '是有效的。例如。 'car.is_valid? == true'。 – dinjas

+0

看看我做了什麼!我仍然可以騙過: 'code' >> car = car.first Car load(0.3ms)SELECT「cars」。* FROM「cars」ORDER BY「cars」。「id」ASC LIMIT? [[「LIMIT」,1]] =># >> car.update_attribute(:user_id,nil) 'code' 對不起;我不明白如何將代碼放入註釋中:-( 我只想顯示的是user_id可以再次設置爲零。 –