1

私は Rails を初めて使用し、ユーザーの変数が に設定されている場合にのみ、ユーザーのログインを許可しようとしています。何らかの理由で if ステートメントを作成しましたが、ユーザーはREGARDLESS IF IT IS VALUE!にサインインできます。私は sqlitebrowser に行き、データベースをチェックしましたが、作成したユーザーは実際に false に設定されています。email_activation_tokentrueemail_activation_token

2つのことに注意してください。HAML を使用しており、ユーザーのログインを維持するための Cookie があります。

(トピックに関するチュートリアルへのリンクがある回答は、役立つのでボーナスポイント)

アプリ/コントローラー/sessions_controller.rb

  def create
    user = User.authenticate(params[:email], params[:password])
    if user.email_activation_token = true
      if user
        if params[:remember_me]
          cookies.permanent[:auth_token] = user.auth_token
        else
          cookies[:auth_token] = user.auth_token
        end
        redirect_to root_url, :notice => "Logged in!"
      else
        flash.now.alert = "Invalid email or password"
        render "new"
      end
    else
      flash.now.alert = "You account has not been activated yet check your email!" 
      render "new"
    end
  end

アプリ/コントローラー/users_controller

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(params[:user])
    if @user.save
      UserMailer.registration_confirmation(@user).deliver
        redirect_to root_url, :notice => "Signed up!"
    else
        render "new"
    end

    def accept_invitation
        @user = User.find_by_email_activation_token!(params[:token])
        @user.email_activation_token = true
        redirect_to root_url, :notice => "Email has been verified."
    end
  end
end

アプリ/ビュー/セッション/new.html.haml

%h1 Log in

= form_tag sessions_path do
  %p
    = label_tag :email
    = text_field_tag :email, params[:email]
  %p
    = label_tag :password
    = password_field_tag :password
  %p.button
    %input{name: "commit", type: "submit", value: "Log in"}
  .field
    = label_tag :remember_me
    = check_box_tag :remember_me, 1, params[:remember_me]
  %p
    = link_to "forgotten password?", new_password_reset_path

アプリ/モデル/user.rb

    class User < ActiveRecord::Base
      attr_accessible :email, :password, :password_confirmation

      attr_accessor :password
      before_save :encrypt_password
      before_save { |user| user.email = email.downcase }
      before_create { generate_token(:auth_token) }
      # before_create { generate_token(:email_activation_token) }

      VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
      VALID_PASSWORD_REGEX = /^(?=.*[a-zA-Z])(?=.*[0-9]).{6,}$/
      validates_confirmation_of :password
      validates :password, :on => :create, presence: true, format: { with: VALID_PASSWORD_REGEX }
      validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }

  def self.authenticate(email, password)
   user = find_by_email(email)
   if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
    user
   else  
    nil
  end
end

  def send_password_reset
    generate_token(:password_reset_token)
    self.password_reset_sent_at = Time.zone.now
    save!
    UserMailer.password_reset(self).deliver
  end

  def encrypt_password
    if password.present?
        self.password_salt = BCrypt::Engine.generate_salt
        self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
    end
  end

def generate_token(column)
  begin
    self[column] = SecureRandom.urlsafe_base64
  end while User.exists?(column => self[column])
end

end

app/config/routes.rb

LootApp::Application.routes.draw do
  get "password_resets/new"

  get "sessions/new"

  resources :users
  resources :sessions
  resources :password_resets
  resources :email_activations

  resources :users do
    collection do 
      get :accept_invitation
    end 
  end

  # get "users/new"
  get "static_pages/home"
  get "static_pages/help"


  root to: 'static_pages#home'
  match "sign_up",  to: "users#new"
  match '/help',    to: 'static_pages#help'
  match '/log_in',  to: 'sessions#new'
  match '/log_out', to: 'sessions#destroy'
  end
4

1 に答える 1

2

app/controllers/sessions_controller.rb :

def create
  # ...
  if user.email_activation_token = true
  # ...

次のようにする必要があります。

def create
  # ...
  if user.email_activation_token == true
  # ...
于 2013-04-28T21:45:37.607 に答える