2012-07-24 191 views
0

我有兩個問題,不知道爲什麼!我遵循教程http://ruby.railstutorial.org/chapters/Ruby on Rails - 登錄會話與編輯

Problem #1: My login and logout don't seem to be working 
Problem #2: My private function doesn't see sign_in? -- I believe however is because sign_in? is declared in the sessionHelpers and I declared this function in the customerController which would explain why I can't see but don't know how to make it see. 

這裏的代碼我有! 模型/ customer.rb 控制器/會話

class SessionsController < ApplicationController 
    def new 
    end 

    def create 
     customer = Customer.find_by_email(params[:session][:email]) 
     if customer && customer.authenticate(params[:session][:password]) 
       # Sign the user in and redirect to the user's show page. 
      sign_in customer 
      redirect_back_or customer 
     else 
      flash.now[:error] = 'Invalid email/password combination' 
      render 'new' 
     end 

    end 

    def destroy 
     sign_out 
     redirect_to root_path 
    end 
end 

控制器/客戶

class CustomersController < ApplicationController 
    before_filter :signed_in_customer, only: [:edit, :update] 
    before_filter :correct_customer, only: [:edit, :update] 

    def new 
     @customer = Customer.new 
    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 show 
     @customer = Customer.find(params[:id]) 
    end 

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

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

    def index 
     @customers = Customer.all 
    end 

    private 
     def signed_in_customer 
      unless signed_in? 
       store_location 
       redirect_to signin_path, notice: "Please sign in." 
      end 
     end 

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

傭工/會話

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

    def sign_in? 
     !current_customer.nil? 
    end 

    def current_customer=(customer) 
     @current_customer = customer 
    end 

    def current_customer?(customer) 
     customer = current_customer 
    end 

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

    def sign_out 
     self.current_customer = nil 
     cookies.delete(:remember_me) 
    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 

再次感謝,比較遺憾的是拼錯

更新:

應用控制器

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    before_filter :pages 

    def pages 
     @pages = Page.all 
    end 
    include SessionsHelper 
end 

這裏當試圖編輯客戶

undefined method `signed_in?' for #<CustomersController:0xb56089ec> 
app/controllers/customers_controller.rb:45:in `signed_in_customer' 

注::我只是做了DB的錯誤:重置並創建一個新帳戶。我是成功的,但標題中的鏈接顯示我註銷。

這裏頭文件

<header class="header"> 
    <div class="menu"> 
    <div class="center"> 
    <div class="logo"> 
      <nav> 
     <ul> 
     <% if sign_in? %> 
      <div>Welcome <%= current_customer.full_name %> </div> 
      <li><%= link_to "Home", root_path %></li> 
      <li><%= link_to "Customers", customers_path %></li> 
       <li><%= link_to "Profile", current_customer %></li> 
       <li><%= link_to "Settings", edit_customer_path(current_customer) %></li> 
       <li><%= link_to "Sign out", signout_path, method: "delete" %></li> 
     <% else %> 
      <li><%= link_to "Home", '#' %></li> 
       <li><%= link_to "Sign in", '#' %></li> 
     <% end %> 
     </ul> 
      </nav> 
    </div> 
    </div> 
    </div> 
</header> 

回答

0

確保您在ApplicationController中輔助

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    include SessionsHelper 
end 

這意味着在你的例子是繼承的ApplicationController(如CustomersController)任何控制器就能訪問您的幫手中的方法

我沒有看過你的所有代碼,但讓我知道這是否解決了你的問題毫秒,如果不讓我知道,我會有一個更長的期待

+0

Nah它已經在它。我更新了我的帖子以顯示它。感謝您的建議 – Jseb 2012-07-24 16:07:30