0

ユーザーモデルを持つ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

スタックレベルが深すぎる

どうすればいいのかわからない

4

0 に答える 0