2016-09-17 11 views
0

私は2012年6月に作成したビデオチュートリアルに従っています。Rubyバージョン1.9.3、およびRailsバージョンは当時3です。今、私はRails 5.0.0.1のコード例を試しています。Rails 5.0.0.1:コンソールからクラスインスタンスを作成できませんか?

現在、アクションではstrong parametersを使用する必要があります。これは、コンソールを使用してクラスのインスタンスオブジェクトを作成する場合にも当てはまりますか?

練習では、モデルユーザーが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> 

レコードが作成されていません!私はそれがレール4と5のstrong parametersと関係があると思われますか?最後に

は、ここに私の質問は以下のとおりです。

  • 何が悪かったのか?コンソールを使用して作成する別の方法がありますか?
  • カーモデルの関係のためです:belongs_to :user
  • 強いパラメータが導入される前の状態を「模倣する」宝石があることは知っていますが、私はむしろこれらを使用したくありません。それは不正行為のように感じる!
+0

車のユーザーを指定していません。 'car.errors'を調べると、なぜ保存されなかったのかがわかります。 –

+0

@SergioTulentsev:そうです!私は '' id''と '' user_id'''を提供しました。そして今、私は新しいレコードを作成できます!ありがとうございました!私は '' id''が自動的に生成されると思ったが、明らかにこの場合はそうではない! –

+0

さらに、存在しないユーザの '' 'user_id'''で作成することはできません! Railsには私のためにたくさんの隠された__gems__があります! –

答えて

2

Rails 5は、this PRからデフォルトでbelongs_toの関連付けが必要です。

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.create!'や 'car = car.create! 'のようなパラメータを持たない新しい' Car'を作ることができます。 'が有効になります。例えば。 'car.is_valid? == true'。 – dinjas

+0

私が何をしたか見てください!私はまだ周りにだますことができます。 'code' >>車= Car.first カーロード(0.3ms)、 "クルマを" SELECT * "車" BY "車" ORDER FROM "ID" ASCのLIMIT。。?=># >> car.update_attribute(:user_id、nil) 'code' 申し訳ありません。私はコメントにコードを入れる方法を理解していません:-( 私が見せたいのは、user_idをnilに再び設定できることです。 –

関連する問題