質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

1回答

3520閲覧

[Rails]Devise modelを利用したtestが通らない

stimlocy

総合スコア11

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2016/12/19 06:59

編集2022/01/12 10:55

Rails 4.2.6 で gem の Devise を使用し Userモデル を作成
RailsTutorialの第11章のような、Userが複数のpostを持てるようにするのが目標ですが、
fixturesを利用したテスト文を書こうとすると、内容がユニークでないとのエラーが発生します。

###エラー内容

ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: UNIQUE constraint failed: users.email: INSERT INTO "users" ("created_at", "updated_at", "id") VALUES ('2016-12-19 06:33:28', '2016-12-19 06:33:28', 298486374)

###users.yml

tester: email: "test@example.com" encryped_password: <%= Devise::Encryptor.digest(User, 'password') %>

###post_test.rb

def setup @user = users(:tester) @post = Post.new(user_id: @user.id, name: "FIRST") end test "valid?" do assert @post.valid? end

また、setupでusersを使わず、postの中身をrails consoleで通った内容にしても、user.emailがユニークでないとエラーを吐かれます。

###追記

source 'https://rubygems.org' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.2.6' # Use sqlite3 as the database for Active Record gem 'sqlite3' # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' # Use CoffeeScript for .coffee assets and views gem 'coffee-rails', '~> 4.1.0' # See https://github.com/rails/execjs#readme for more supported runtimes # gem 'therubyracer', platforms: :ruby # Use jquery as the JavaScript library gem 'jquery-rails' # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks gem 'turbolinks' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.0' # bundle exec rake doc:rails generates the API under doc/api. gem 'sdoc', '~> 0.4.0', group: :doc # Use ActiveModel has_secure_password # gem 'bcrypt', '~> 3.1.7' # Use Unicorn as the app server # gem 'unicorn' # Use Capistrano for deployment # gem 'capistrano-rails', group: :development group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug' end group :development do # Access an IRB console on exception pages or by using <%= console %> in views gem 'web-console', '~> 2.0' # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'spring' end gem 'devise'
class DeviseCreateUsers < ActiveRecord::Migration def change create_table :users do |t| ## Database authenticatable t.string :email, null: false, default: "" t.string :encrypted_password, null: false, default: "" ## Recoverable t.string :reset_password_token t.datetime :reset_password_sent_at ## Rememberable t.datetime :remember_created_at ## Trackable t.integer :sign_in_count, default: 0, null: false t.datetime :current_sign_in_at t.datetime :last_sign_in_at t.string :current_sign_in_ip t.string :last_sign_in_ip ## Confirmable # t.string :confirmation_token # t.datetime :confirmed_at # t.datetime :confirmation_sent_at # t.string :unconfirmed_email # Only if using reconfirmable ## Lockable # t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts # t.string :unlock_token # Only if unlock strategy is :email or :both # t.datetime :locked_at t.timestamps null: false end add_index :users, :email, unique: true add_index :users, :reset_password_token, unique: true # add_index :users, :confirmation_token, unique: true # add_index :users, :unlock_token, unique: true end end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

今回の質問は、エラーが出ているのを解消したいという事で良いですか?
でしたら、まずはエラーの内容を把握しましょう。

で、環境を知らないですが、現在出ているエラーから推測すると、
0. ユーザIDが"298486374"の人のemailが"test@example.com"
0. testで登録しようとしているemailがユニークじゃなので、エラーとなっている
0. emailがユニークでないと怒っているのは、modelではなくDB側(SQLite3)

上記のような状態だと思われます。
ですので、emailが重複しても良い環境を作りたいのであれば、
DB側のUser.emailに付いているであろうuniqキーを外してあげるべきかと。

投稿2016/12/19 08:27

IPU

総合スコア283

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stimlocy

2016/12/19 08:49 編集

エラーが解消する = rake test:models で errorsが0 (テスト内容の成否に関わらず)というのを想定しております。 環境というのは、Gemfileなどの環境でしょうか? 本文の方に、Gemfileと、Userモデルのマイグレーションを追記しておきます。 また、emailはデフォルトで重複をさせない方向ですので、uniqueはtrueのままでお願いします。 Console上ではもちろんDB内に既に存在するemailでは、@user.valid?はfailseになりますが、このfixturesに書かれている内容は、重複しておりません。
IPU

2016/12/19 09:18

情報追記、ありがとうございます。 emailは重複させない方向なのは、理解しました。 あー、ではテストで投入される前、つまり現状のままで重複しているデータが存在しているのではないでしょうか? 試しに、rails cosoleへ入って、 User.all.pluck(:email) を叩いてみて、既に重複したレコードが存在していないか確認してみてくれませんか? 違っていたら、すいません。
stimlocy

2016/12/20 00:36

試してみましたが、重複内容はありませんでした。 また、db:reset でDBをリセットしてみても、エラー内容に変化はありませんでした。 この時、seedsは設定しておりません。
stimlocy

2016/12/20 01:37

schemaに書かれていたunique部分は add_index "users", ["email"], name: "index_users_on_email", unique: true add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true でしたので、user.rb に validates :email, uniqueness:true validates :reset_password_token, uniqueness:true を追記してみましたが、結果は変わりませんね。 各片方ずつで試した場合でも同様でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問