0

私は何かを台無しにしているようで、それが何であるかわかりません!しかし、それが機能するはずだったので、それは機能しません

もともと私はremembermeボックスを実装しようとしていましたが、それはスピンを要し、今では顧客の詳細を編集して更新すると、自動的にログアウトします。なぜこれが起こっているのかわかりませんが、ここにスニペットがあります

クラスCustomersController<ApplicationController

def index
    @customers = Customer.all
end

def new
    @customer  = Customer.new
end

def show
    @customer = Customer.find(params[:id])
    @posts = @customer.posts
end

def create
        @customer = Customer.new(params[:customer])
        if @customer.save
        sign_in @customer
        flash[:success] = "Welcome to Where you Where!"
        redirect_to @customer

        else
            render 'new'
        end
end

def edit
    @customer = Customer.find(params[:id])
end

def update
    if @customer.update_attributes(params[:customer])
        flash[:success] = "Profile Updated"
        redirect_to @customer
    else
        render 'edit'
    end
end

def destroy
    Customer.find(params[:id]).destroy
    redirect_to root_path
end

private

    def current_customer?(customer)
        customer == current_customer
    end

    def correct_customer
        @customer = Customer.find(params[:id])
        redirect_to(root_path) unless current_customer?(@customer)
    end

    def admin_customer
        redirect_to(root_path) unless current_customer && current_customer.admin?
    end

終わり

ここに私のセッションコントローラー

module SessionsHelper

 def sign_in(customer)
   cookies.permanent.signed[:remember_token] = [customer.id, customer.salt]
   self.current_customer = customer
 end
 def sign_out
    cookies.delete(:remember_token)
    self.current_customer = nil
  end

  def signed_in?
    !current_customer.nil?
  end

 def current_customer?(customer)
    return false unless current_customer
    current_customer.id == customer.id
  end
  def current_customer=(customer)
    @current_customer = customer
  end

  def current_customer
     @current_customer ||= customer_from_remember_token
  end
  def authenticate
    deny_access unless signed_in?
  end
  def deny_access
    store_location
    redirect_to signin_path, :notice => "Please sign in to access this page."
  end
  def redirect_back_or(default)
    redirect_to(session[:return_to] || default)
    clear_return_to
  end


  private

   def customer_from_remember_token
      Customer.authenticate_with_salt(*remember_token)
   end

   def remember_token
      cookies.signed[:remember_token] || [nil, nil]
   end
   def store_location
     session[:return_to] = request.fullpath
   end
   def clear_return_to
     session[:return_to] = nil
   end

end

ここにヘルプファイルがあります

module SessionsHelper

    def sign_in(customer)
            cookies.permanent[:remember_token] = customer.remember_token
            self.current_customer = customer
    end

    def signed_in?
        !current_customer.nil?
    end

    def sign_out
        self.current_customer = nil
        cookies.delete(:remember_token)
    end

    def current_customer=(customer)
        @current_customer = customer
    end

    def current_customer
        @current_customer ||= Customer.find_by_remember_token(cookies[:remember_token])
    end

    def current_customer?(customer)
        customer == current_customer
    end

    def redirect_back_or(default)
        redirect_to(session[:return_to] || default)
        session.delete(:return_to)
    end

    def store_location
        session[:return_to] = request.fullpath
    end
end

私はhttp://ruby.railstutorial.org/chapters/にあるチュートリアルに従っていて、第10章にありました。しかし、railcastによってremember meチェックマークボックスを実装しようとしていますが、まったく機能しないようです。(別のコード)

再度、感謝します

追加のサポートのためにこれを追加しました

class ApplicationController < ActionController::Base
    protect_from_forgery
    before_filter :pages

    def pages
        @pages = Page.all
    end

private

    def current_customer
      @current_customer ||= Customer.find(session[:customer_id]) if session[:customer_id]
    end
    helper_method :current_customer

    def authorize
      redirect_to login_url, alert: "Not authorized" if current_customer.nil?
    end

    include SessionsHelper
end

更新::ここでフィルターをかける前にコメントアウトしようとした後、何が起こっているのか。あなたのチュートリアルに続いて、私はあなたのメソッドを使って実装しようとし、それが小さな点や何かではないことを確認します。しかし、それが私の新しいエラーです。

NameError in SessionsController#create
undefined local variable or method `encrypted_password' for #<Customer:0xb57f11c8>

だからここに私の最新の顧客モデル

class Customer < ActiveRecord::Base
# RELATIONS

    has_many :posts, dependent: :destroy

# Data Access

    attr_accessor :password
    attr_accessible :first_name, :last_name, :middle_name, :email, :password, :password_confirmation
    before_save :encrypt_password

# VALIDATION

    validates :first_name, presence: true, length: { maximum: 50 }
    validates :middle_name, length: { maximum: 50 }
    validates :last_name, presence: true, length: { maximum: 50 }
    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
    validates :email, presence:   true,
                    format:     { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
    validates_uniqueness_of :email
    validates :password, presence: true, length: { minimum: 6 }
    validates :password_confirmation, presence: true

# METHODS

    def has_password?(submitted_password)
        encrypted_password == encrypt(submitted_password)
    end

    def self.authenticate(email, submitted_password)
        customer = find_by_email(email)
        customer && customer.has_password?(submitted_password) ? customer : nil
    end

    def self.authenticate_with_salt(id, cookie_salt)
        customer = find_by_id(id)
        (customer && customer.salt == cookie_salt) ? customer : nil
    end

 private 
    def encrypt_password
      self.salt = make_salt if new_record?
      self.encrypted_password = encrypt(password)
    end
    def encrypt(string)
      secure_hash("#{salt}--#{string}")
    end  
    def make_salt
      secure_hash("#{Time.now.utc}--#{password}")
    end
    def secure_hash(string)
      Digest::SHA2.hexdigest(string)
    end 
end


# == Schema Information
#
# Table name: customers
#
#  id               :integer         not null, primary key
#  first_name       :string(255)
#  email            :string(255)
#  created_at       :datetime        not null
#  updated_at       :datetime        not null
#  password_digest  :string(255)
#  remember_token   :string(255)
#  last_name        :string(255)
#  middle_name      :string(255)
#  auth_token       :string(255)
#  login_count      :integer         default(0)
#  current_login_at :datetime
#  last_login_at    :datetime
#  current_login_ip :string(255)
#  last_login_ip    :string(255)
#  password_hash    :string(255)
#  password_salt    :string(255)
#

これらのメソッドが定義されていない理由がわかりません。彼らは自己参照しています!

4

1 に答える 1

0

うーん、コードを調べましたが、ログアウトの原因となるものは何も見つかりません. 私のチュートリアル アプリへのリンクは次のとおりです: https://github.com/htw-rails/TutorialSampleApp32 - すべてのメソッドはおおよそです。あなたと同じです。before_filters をコメントアウトして、違いがあるかどうかを確認します。

于 2012-07-23T23:16:36.913 に答える