2017-10-23 12 views
0
Rails 5.1 

を実行しようとすると、エラーメッセージを取得する:私のuser.rbのモルデ私は私が持っている私のseeds.rbファイルでは、シードスクリプト

user = User.new(
    :email =>'[email protected]', 
    :password =>'xK#986754', 
    :password_confirmation =>'xK#986754', 
    :first_name =>'John', 
    :last_name =>'Smith', 
    :role => 1 
    :approved => true 
) 
user.skip_invitation 
user.save 

、私が持っている:

class User < ActiveRecord::Base 

    enum role: [:user, :vip, :admin] 
    after_initialize :set_default_role, :if => :new_record? 


    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :invitable, :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    attr_accessor :email, :password, :first_name, :last_name, :role, :approved 

    validates :email, uniqueness: true, presence: true 
    validates :first_name, presence: true 
    validates :last_name, presence: true 
    validates :role, presence: true 

    def set_default_role 
    self.role ||= :user 
    end 
end 

私の移行ファイルでは、私は:

class DeviseCreateUsers < ActiveRecord::Migration[5.1] 
    def change 
    create_table :users do |t| 

     t.string :first_name, null: false 
     t.string :last_name, null: false 
     t.integer :role, null: false 
     t.string :email, null: false 

     ## Approved 
     t.boolean :approved, :default => 0, :null => false 

私はシードファイルを実行しようとすると、私は次のエラーメッセージ:

ActiveRecord::NotNullViolation: Mysql2::Error: Field 'first_name' doesn't have a default value: INSERT INTO `users` (`approved`, `created_at`, `updated_at`) VALUES (1, '2017-10-23 02:23:36', '2017-10-23 02:23:36') 

が、私は明らかに工夫宝石

任意のアイデアを使用していますか?

+1

ヒント:そこにいるフィールドには 'attr_accessor'とは何ですか?これにより、基礎となるデータベース属性へのアクセスがブロックされます。 – tadman

答えて

1

attr_accessor行を削除してください。 attr_accessorは、クラスにインスタンス変数をラップする簡単なgetter/setterメソッドを宣言するためのものです。データベースに保存する属性のRailsモデルでは使用できません。つまり、attr_accessor属性はすべてメモリ内にのみ存在し、モデルはデータベースに書き込まないため、エラーメッセージと挿入クエリの欠損値がすべて失われます。

+0

attr_accessor行を削除すると、問題が解決しました。私はattr_accessorがどのように動作するのか誤解しました。説明ありがとう。 – EastsideDeveloper

0

あなたはファーストネームの値を指定せず、ヌルを許可しないようにデータベースに指示していますが、デフォルト値を指定していません。

なぜ実際にあなたが持っていないときにあなたが価値を提供したと思いますか?あなたが最後にレールテストをしたのはいつですか?これは最初からこの権利を拾い上げたでしょうか?

あなたのモデルは名前のためのattr_accessor年代を持っていますが、あなたが本当に欲しいattr_accessorを取り除くかbefore_save

に名前attr_accessorから名前フィールドを設定しますいずれかのように、あなたはどこにでもattr_accessorからの根本的な名前フィールドを設定されていませんあなたのattr_accessorのすべてを削除することです また、なぜコーディングスタイルを混ぜていますか?これは

t.boolean :approved, :default => 0, :null => false 

本当に

t.boolean :approved, default: 0, null: false 

がレールに整列するには、それを持参しなければなりませんあなたの移行で をmaintentanceに来るとき、それはあなたの後ろに続くものに混乱することができますように悪い習慣です5コーディングスタイル

+0

私はfirst_nameを提供しています。私が誤解していたのは、attr_accessorがどのように動作するかです。 – EastsideDeveloper

+0

@EastsideDeveloperいいえ、あなたはあなたが持っていただけではありませんでした。あなたがそれを持っていれば、コードはそれゆえに "実際にあなたが持っていないときにあなたが価値を提供したと思うのはなぜですか?"これはattr_accessorsだけではありませんが、自動的に生成されたテストスイートでこのエラーを早期に選択しておらず、もう少し知識が必要であることを示唆しています。コーディングスタイルを混ぜてテストしない場合は、秋に向かいます。 – jamesc

関連する問題