私は何かを台無しにしているようで、それが何であるかわかりません!しかし、それが機能するはずだったので、それは機能しません
もともと私は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)
#
これらのメソッドが定義されていない理由がわかりません。彼らは自己参照しています!