2015-12-31 144 views
1

我是ruby on rails应用程序的新手,从最近几天我患有Login & Logout问题,现在我已经达成了解决方案,但现在已经创建了一个新问题。当我给无效的密码,然后它显示Ruby on Rails登录和注销问题

无效的电子邮件/密码组合

当我给有效的密码,然后它显示Logged In

但登录逻辑后不工作。

这是我sessions_controller:

def new 
end 

def create 
    user = Jobseeker.find_by(email: params[:session][:email].downcase) 
    if user && user.authenticate(params[:session][:password]) 
    redirect_to home_path 
    flash[:notice] = 'Logged In' 
    else 
    # Create an error message. 
    flash[:notice] = 'Invalid email/password combination' 
    render 'new' 
    end 
end 

def destroy 
    log_out 
    redirect_to home_path 
end 

这是我的模型:

before_save { email.downcase! } 

validates :first_name, :presence => true, :length => { :in => 3..20 } 
validates :last_name, :presence => true, :length => { :in => 3..20 } 
validates :email, :presence => true, :uniqueness => true, format: { with: /\A[^@\s][email protected]([^@.\s]+\.)+[^@.\s]+\z/ } 

has_secure_password 
validates :password, presence: true, length: { minimum: 6 } 

这是我的看法:

<%= form_for(:session, url: login_path) do |f| %> 
    <%= f.email_field :email %> 
    <%= f.password_field :password%> 

    <%= f.submit "Log in" %> 
<% end %> 

这是我sessions_helper:

# Logs in the given user. 
def log_in(user) 
    session[:user_id] = user.id 
end 

# Returns the current logged-in user (if any). 
def current_user 
    @current_user ||= Jobseeker.find_by(jobseeker_id: session[:user_id]) 
end 

# Returns true if the user is logged in, false otherwise. 
def logged_in? 
    !current_user.nil? 
end 

# Logs out the current user. 
def log_out 
    session.delete(:user_id) 
    @current_user = nil 
end 

这是我application_controller:

protect_from_forgery with: :exception 
include SessionsHelper 

这是我的布局:

<% if logged_in? %> 
    <%= link_to "Profile", current_user.first_name %> 
    <%= link_to "Log out", logout_path, method: :delete %> 
<% else %> 
    <li><%= link_to "Login", login_path %></li> 
<% end %> 

我怎样才能解决这个问题?

我使用ruby 1.9.7Rails 4.2.5 & mysql2

这将帮助我很多,请。

+0

但是你在哪里使用此方法登录?控制器中没有“登录”用法,对吧?当你创建一个会话时,你不需要使用助手的方法。 – PatNowak

回答

1

在您的创建方法中,您未设置会话变量,该变量将标记用户移动页面时的“已登录”状态。

"current_user" in session_helper.rb使用session[:user_id],当前用户应为user_id,由您在登录后设置。

因此,您应该在create方法上设置session[:user_id] = user.id,方法为session_controller.rb

修改后的session_controller#创建应该是什么样子,

def create 
    user = Jobseeker.find_by(email: params[:session][:email].downcase) 
    if user && user.authenticate(params[:session][:password]) 
    login(user) 
    flash[:notice] = 'Logged In' 
    redirect_to home_path 
    else 
    # Create an error message. 
    flash[:notice] = 'Invalid email/password combination' 
    render 'new' 
    end 
end 

希望这将解决您的问题。

编辑: 修改会话密钥名称以匹配您的上下文。

+0

解决方案不起作用 –

+0

我修改了一些代码。希望这个工程现在! –

+0

哇!辉煌:) –