1

Michael Hartl の Rails チュートリアルを読んでいるのですが、10 章のこの行が理解できませんでした。 authenticated?(:activation, params[:id])

著者によると、この行は と を比較するために使用されactivation_digestます。tokenこれは、トークンがで利用可能になることを意味します。params[:id]

これは私が混乱するところです。params[:id]ユーザーのIDID を activation_digest と比較するにはどうすればよいですか?

しかしauthenticated?(:remember, cookies[:remember_token])、私には完全に理にかなっています。誰 ?あなたの助けは非常に高く評価されます!

関連するコードを以下に示します。

account_activations_controller.rb

class AccountActivationsController < ApplicationController
    def edit
    user = User.find_by(email: params[:email])
    if user && !user.activated? && user.authenticated?(:activation, params[:id])
      user.activate
      log_in user
      flash[:success] = "Account activated!"
      redirect_to user
    else
      flash[:danger] = "Invalid activation link"
      redirect_to root_url
    end
  end
end

ルート.rb

Rails.application.routes.draw do
  get 'password_resets/new'

  get 'password_resets/edit'

  get 'sessions/new'

  get 'users/new'

  root             'static_pages#home'
  get 'help'    => 'static_pages#help'
  get 'about'   => 'static_pages#about'
  get 'contact' => 'static_pages#contact'
  get 'signup'  => 'users#new'
  get    'login'   => 'sessions#new'
  post   'login'   => 'sessions#create'
  delete 'logout'  => 'sessions#destroy'
  resources :users
  resources :account_activations, only: [:edit]
  resources :password_resets,     only: [:new, :create, :edit, :update]

ユーザー.rb

class User < ActiveRecord::Base
    attr_accessor :remember_token, :activation_token, :reset_token
  before_save   :downcase_email
    before_create :create_activation_digest
    validates :name,   presence: true, length: { maximum: 50 }
    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
    validates :email,  presence: true, length: { maximum: 255 },
                       format: { with: VALID_EMAIL_REGEX },
                       uniqueness: { case_sensitive: false }
    has_secure_password
    validates :password, length: { minimum:6 }, allow_blank: true

class << self
    # Returns the hash digest of the given string.
  def digest(string)
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                  BCrypt::Engine.cost
    BCrypt::Password.create(string, cost: cost)
  end

    # Returns a random token.
  def new_token
    SecureRandom.urlsafe_base64
  end
end

  # Remembers a user in the database for use in persistent sessions.
  def remember
    self.remember_token = User.new_token
    update_attribute(:remember_digest, User.digest(remember_token))
  end

  # Returns true if the given token matches the digest.
  def authenticated?(remember_token)
    return false if remember_digest.nil?
    BCrypt::Password.new(remember_digest).is_password?(remember_token)
  end

  # Returns true if the given token matches the digest.
  def authenticated?(attribute, token)
    digest = send("#{attribute}_digest")
    return false if digest.nil?
    BCrypt::Password.new(digest).is_password?(token)
  end

  # Forgets a user.
  def forget
    update_attribute(:remember_digest, nil)
  end

  # Activates an account.
  def activate
    update_attribute(:activated,    true)
    update_attribute(:activated_at, Time.zone.now)
  end

  # Sends activation email.
  def send_activation_email
    UserMailer.account_activation(self).deliver_now
  end

  # Sets the password reset attributes.
  def create_reset_digest
    self.reset_token = User.new_token
    update_attribute(:reset_digest,  User.digest(reset_token))
    update_attribute(:reset_sent_at, Time.zone.now)
  end

  # Sends password reset email.
  def send_password_reset_email
    UserMailer.password_reset(self).deliver_now
  end

private
# Converts email to all lower-case.
def downcase_email
  self.email = email.downcase
end

# Creates and assigns the activation token and digest.
def create_activation_digest
  self.activation_token  = User.new_token
  self.activation_digest = User.digest(activation_token)
 end
end
4

1 に答える 1

1

ruby on rails talk on google に投稿すると、ついに誰かが私の質問に答えてくれました。Michael Hartl の本を読んでいる人には、これが役に立つかもしれません。

とにかく、全体のポイントはparams[:id] 、ルートによって生成されたURLと関係があることを示すroutes.rbファイルに関連しています。この場合 。RailsでRESTful URLを使用しています

URL が次の場合としましょう: https://www.examples.com/account_activations/token_fFb_F94mgQtmlSvRFGsITw/edit?email=michael%40michaelhartl.com

その場合、params[:id] は「token_fFb_F94mgQtmlSvRFGsITw」になります。

より良い説明はこちらにありますここをクリックして確認してください

私の問題は、params[:id]の「:id」をユーザー テーブルの数値 ID 属性と間違えたことです。あなたが私と同じ間違いをしないことを願っています。幸運を !

于 2015-04-10T02:27:33.877 に答える