2010-07-09 2 views
0

Это код из моего входа Страница:Где я получил NoMethodError, используя спокойную авторизацию?

<%= flash[:notice]%> 
<h1>System</h1>    
<%= Time.now%></p> 
<p><%=link_to "Register", signup_path%></p> 
<div id="login"> 
    <%if logged_in? %>  
     <b><%=current_user.login%></b> 
     <%=link_to "Signout", logout_path%> 
    <%else%> 
     <% form_remote_tag :url => session_path do -%> 
     <p><%= label_tag 'login' %> 
     <%= text_field_tag 'login', @login %> <%= label_tag 'password' %> 
     <%= password_field_tag 'password', nil %></p> 

     <p><%= label_tag 'remember_me', 'Remember me' %> 
     <%= check_box_tag 'remember_me', '1', @remember_me %></p> 
     <p><%= submit_tag 'Log in' %></p> 
     <% end -%>   
    <%end%> 
</div>  

И это sessions_controller.rb:

# This controller handles the login/logout function of the site. 
class SessionsController < ApplicationController 
    # Be sure to include AuthenticationSystem in Application Controller instead 
    #include AuthenticatedSystem 

    # render new.rhtml 
    def new 
    end 

    def create 
    logout_keeping_session! 
    user = User.authenticate(params[:login], params[:password]) 
    if user 
     # Protects against session fixation attacks, causes request forgery 
     # protection if user resubmits an earlier form using back 
     # button. Uncomment if you understand the tradeoffs. 
     # reset_session 
     self.current_user = user 
     new_cookie_flag = (params[:remember_me] == "1") 
     handle_remember_cookie! new_cookie_flag 
     #redirect_back_or_default('/') 
     flash[:notice] = "Logged in successfully" 
     self.reload_login() 
    else 
     note_failed_signin 
     @login  = params[:login] 
     @remember_me = params[:remember_me] 
     render :action => 'new' 
    end 
    end 

    def destroy 
    logout_killing_session! 
    flash[:notice] = "You have been logged out." 
    redirect_back_or_default('/') 
    end  

    def reload_login 
    respond_to {|format| format.js} 
    flash[:notice] = "What the hell?" 

    end 

protected 
    # Track failed login attempts 
    def note_failed_signin 
    flash[:error] = "Couldn't log you in as '#{params[:login]}'" 
    logger.warn "Failed login for '#{params[:login]}' from #{request.remote_ip} at #{Time.now.utc}" 
    end 
end 

Я могу войти на страницу, но в то время как я жду некоторое время, через несколько минут , я обнаружил, что я получил NoMethodError ошибочного System # указательного ...

undefined method `remember_token?' for true:TrueClass 
Extracted source (around line #6): 

3: <%= Time.now%></p> 
4: <p><%=link_to "Register", signup_path%></p> 
5: <div id="login"> 
6: <%if logged_in? %>  
7:  <b><%=current_user.login%></b> 
8:  <%=link_to "Signout", logout_path%> 
9: <%else%> 

Я не знаю, что происходит не так, он работает в первом запуске. Но если я перейду на «http://localhost:3000/login», чтобы снова войти в систему, ошибка исчезла, что случилось? Спасибо.

ответ

0

вы смотрели в миграции базы данных. Проверьте, есть ли у вас атрибут remember_token в вашей таблице и есть ли его тип bool или нет.

4

Открыть authenticated_system.rb и изменить and к && в следующей строке (это 128 на меня):

user = !cookies[:auth_token].blank? and User.find_by_remember_token(cookies[:auth_token]) 

Это распространенная ошибка для обмена и к & &:

p true and false # returns true 
p true && false # returns false, this is the conventional behaviour