2016-12-21 19 views
0

ユーザーのapi_keyを作成しようとしています。セットアップがそのnull以外であるようにしてください。レールモデルは作成時に属性を生成しません。nullでないdbテストに失敗します

レール4では、-nullがトリガーされませんが、アイテムbefore createを作成していますが、なぜですか? if putsdef generate_access_token私はaccess_tokenには という名前がついていますが、saveコマンドの一部としてアクセストークン(下のdbレコードを参照)が含まれていないようです。

stumped!私は何か愚かなことを逃したに違いない、確かに?これは

.LOG新しいオブジェクト

テストとして動作しません - 私は私ではなく、直接属性よりもupdate_attribute試してみましたが、それをafter_save

  • を行うことができないDBで

    • その非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 
      
  • 答えて

    1

    while self.class.exists?(access_token: access_token)access_token = nilのための偽となります。 beginの前にまずトークンを割り当ててみてください。

    def generate_access_token 
        return if access_token 
        token = SecureRandom.hex 
        token = SecureRandom.hex while self.class.exists?(access_token: access_token) 
        self.access_token = token 
    end 
    
    +0

    ありがとうございます。 – Ben

    関連する問題