私はポイントシステムを実装しています。ユーザーが作成すると、ユーザーにはいくつかの点があります。 私のregistrations_controller_spec.rbは以下の通りです。登録のRspecエラーdevysの処置
require 'rails_helper'
RSpec.describe Users::RegistrationsController, type: :controller do
describe 'sign in' do
before do
@user=build(:user)
@request.env["devise.mapping"] = Devise.mappings[:user]
end
it 'adds 60 point with default' do
post :create , params: {name: @user.name , sex: @user.sex , age: @user.age ,country: @user.country ,email: @user.email ,password: @user.password, password_confirmation: @user.password , confirmed_at: DateTime.now }
expect(response).to render_template root_path
expect(@user.points).to eq (60)
end
end
end
とMy registrations_controller.rbは以下のとおりです。
class Users::RegistrationsController < Devise::RegistrationsController
def create
super
if resource.save
resource.rewards.create(point: 60)
end
end
end
これはカスタムコントローラなので、私のconfig/routes.rbは以下の通りです。
Rails.application.routes.draw do
devise_for :users, controllers: {
registrations: 'users/registrations' ,
}
end
私は以下のエラーがあります。要するに
expected: 60
got: 0
は、私は「期待(@ user.points).TO EQ(60)」「を期待する(@userを変更したときに以下のエラーが発生しましたので、私は、ユーザーを作成することができなかったと思います。 reload.points).to eq(60) '。
Couldn't find User without an ID
エラーが発生しますか?私を助けてください。とにかく、ユーザーモデルファイルは以下の通りです。
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable, :timeoutable, :omniauthable, :omniauth_providers => [:facebook]
default_scope -> {order(created_at: :desc)}
validates :name , presence: true , length: {maximum: 18}
validates :sex , presence: true
validates :age , presence: true
validates :country , presence: true
def points(force_reload = false)
self.rewards(force_reload).sum(:point)
end
end
と私のApplicationControllerには、私のtest.logは以下の通りです
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_filter :configure_permitted_parameters, if: :devise_controller?
def after_sign_in_path_for(resource)
if (session[:previous_url] == user_path(resource))
user_path(resource)
else
session[:previous_url] || user_path(resource)
end
end
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name,:age,:sex,:skill,:content, :picture , :country , :language1, :language2 ])
devise_parameter_sanitizer.permit(:account_update, keys: [:name,:age,:sex,:skill,:content, :picture , :country , :language1, :language2 ])
end
end
(用途はファイル内の強いパラメータを考案)以下です。
Processing by Users::RegistrationsController#create as HTML
Parameters: {"params"=>{"email"=>"[email protected]", "name"=>"Shiruba", "sex"=>"男性", "age"=>"10代", "country"=>"Japan", "language1"=>"Japanese", "language2"=>"Korea", "content"=>"heyheyheyeheyeheye", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "confirmed_at"=>"2017-01-04T02:33:47+00:00"}}
[1m[35m (0.1ms)[0m SAVEPOINT active_record_1
[1m[36m (0.1ms)[0m [1mROLLBACK TO SAVEPOINT active_record_1[0m
Rendered devise/registrations/new.html.erb within layouts/application (0.3ms)
Completed 200 OK in 937ms (Views: 13.5ms | ActiveRecord: 0.7ms)
と私の工場は以下の通りです。
FactoryGirl.define do
factory :user do
sequence :email do |n|
"shiruba#{n}@docomo.ne.jp"
end
name "Shiruba"
sex "男性"
age "10代"
country 'Japan'
content 'heyheyheyeheyeheye'
password "shibaa"
password_confirmation "shibaa"
confirmed_at { DateTime.now } #ブロックに入れることでこれを実行したときのnowになる。
end
end
'expect(@ user.points).to eq(60)'の代わりに 'expect(User.last.points).to eq(60)'を試すことができますか?あなたの '@ user'はまだ保存されていないので、' IDなしでユーザーを見つけることができませんでした '(ただし、 '@ user'に基づいて値を設定した別のユーザーを保存しました) – amree