ユーザーモデルを持つWebアプリに取り組んでいます。サインアップするか、アプリを試して「ゲスト」になります。ゲスト オプションを追加するまで、サインアップ機能は正常に機能していました。私はこれを行うために Railscast に基づいています ( http://railscasts.com/episodes/393-guest-user-record ) 。
これが私のユーザーモデルコードです
class User < ActiveRecord::Base
attr_accessible :name, :email, :password, :password_confirmation
has_many :bookings
has_one :account, dependent: :destroy
# before_save :downcase_email, allow_nil: true
before_save :create_remember_token
validates_presence_of :name, :email, :password, :password_confirmation, unless: :guest?
validates_uniqueness_of :email, case_sensitive: false , allow_blank: true
validates :name, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, format: { with: VALID_EMAIL_REGEX }, unless: :guest?
validates :password, length: { minimum: 6 }, unless: :guest?
def downcase_email
{ |user| user.email = email.downcase }
end
# has_secure_password
# override has_secure_password to customize validation until Rails 4.
require 'bcrypt'
attr_reader :password, :password_confirmation
include ActiveModel::SecurePassword::InstanceMethodsOnActivation
##def to_param
## "#{id}.#{name.parameterize}"
##end
def self.new_guest
new { |u| u.guest = true }
end
def name
guest ? "Guest" : name
end
private
def create_remember_token
self.remember_token = SecureRandom.urlsafe_base64
end
end
ここに私のユーザーコントローラーコードがあります:
class UsersController < ApplicationController
before_filter :signed_in_user, only: [:edit, :update]
before_filter :correct_user, only: [:edit, :update]
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = params[:user] ? User.new(params[:user]) : User.new_guest
if @user.save
sign_in @user
@user.create_account.accountPlan = "Free"
##flash[:success] = "Welcome to the HighTide!"
redirect_to @user
else
render 'new'
end
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
#flash[:success] = "Profile updated"
sign_in @user
redirect_to @user
else
render 'edit'
end
end
private
def correct_user
@user = User.find(params[:id])
redirect_to(root_path) unless current_user?(@user)
end
def admin_user
redirect_to(root_path) unless current_user.admin?
end
end
一部のコードがコメントアウトされていることに気付くかもしれません。メールのないユーザーをデータベースに保存することはできませんでした (そして、迅速かつ汚い作業を行うために、コールバック before_save にコメントします。また、Michael Hartl tut のガイドラインを使用していることを付け加えるかもしれません)
何が起こるかというと、このコードを実行すると が表示されますunknown attribute: password_confirmation error
が、コメントアウトすると
require 'bcrypt'
attr_reader :password, :password_confirmation
include ActiveModel::SecurePassword::InstanceMethodsOnActivation
と使用has_secure_password instead
スタックレベルが深すぎる
どうすればいいのかわからない