ユーザーのapi_keyを作成しようとしています。セットアップがそのnull以外であるようにしてください。レールモデルは作成時に属性を生成しません。nullでないdbテストに失敗します
レール4では、-nullがトリガーされませんが、アイテムbefore create
を作成していますが、なぜですか? if puts
のdef generate_access_token
私はaccess_tokenには という名前がついていますが、saveコマンドの一部としてアクセストークン(下のdbレコードを参照)が含まれていないようです。
stumped!私は何か愚かなことを逃したに違いない、確かに?これは
.LOG新しいオブジェクトテストとして動作しません - 私は私ではなく、直接属性よりもupdate_attribute試してみましたが、それをafter_save
- その非nullの場合
SQL (0.5ms) INSERT INTO "api_keys" ("created_at", "updated_at") VALUES (?, ?) [["created_at", "2016-12-21 08:09:07.304051"], ["updated_at", "2016-12-21 08:09:07.304051"]]
* access_token *が見つかりません。なぜですか?なぜですか?
エラー
$ rspec spec/models/api_key_spec.rb F Failures: 1) ApiKey populates token Failure/Error: let!(:a) { FactoryGirl.create(:api_key) } ActiveRecord::StatementInvalid: SQLite3::ConstraintException: NOT NULL constraint failed: api_keys.user_id: INSERT INTO "api_keys" ("created_at", "updated_at") VALUES (?, ?) ..... # --- Caused by: --- # SQLite3::ConstraintException: # NOT NULL constraint failed: api_keys.user_id # /Users/ben.forrest/.rvm/gems/[email protected]/gems/sqlite3-1.3.12/lib/sqlite3/statement.rb:108:in `step' Finished in 0.11903 seconds (files took 3.32 seconds to load) 1 example, 1 failure Failed examples: rspec ./spec/models/api_key_spec.rb:5 # ApiKey populates token
api_key_spec.rb
require 'rails_helper' RSpec.describe ApiKey, type: :model do let!(:a) { FactoryGirl.create(:api_key) } it "populates token" do expect(a.access_token).to match /[A-Za-z0-9]{32}/ end end
api_key.rb
class ApiKey < ActiveRecord::Base attr_accessor :access_token, :expires_at, :user_id, :active, :application before_create :generate_access_token before_create :set_expiration belongs_to :user def expired? DateTime.now >= self.expires_at end private def generate_access_token begin self.access_token = SecureRandom.hex end while self.class.exists?(access_token: access_token) puts "**** access_token: #{access_token}****" # this shows it is created end def set_expiration self.expires_at = DateTime.now+30 end end
移行
class CreateApiKeys < ActiveRecord::Migration def change create_table :api_keys do |t| t.string :access_token, null: false t.integer :user_id, null: false t.boolean :active, null: false, default: true t.datetime :expires_at t.timestamps end add_index :api_keys, ["user_id"], name: "index_api_keys_on_user_id", unique: false add_index :api_keys, ["access_token"], name: "index_api_keys_on_access_token", unique: true end end
ありがとうございます。 – Ben