0

标题几乎总结了它 - 登录/注销功能似乎不起作用,我已经按照教程进行操作,不用说这很奇怪。

详细说明“不工作”的含义 - 当我单击登录并输入我的登录凭据时,它只是将我重定向到 /users/id 页面,尽管导航保持不变,因为它仍然具有登录选项。同样,当我最初实际登录时(我现在不能登录了),注销功能不会做任何事情,我会保持登录状态。

_header 部分:

<header class="navbar navbar-fixed-top navbar-inverse">
  <div class="navbar-inner">
    <div class="container">
      <%= link_to "sample app", root_path, id: "logo" %>
      <nav>
        <ul class="nav pull-right">
          <li><%= link_to "Home", root_path %></li>
          <li><%= link_to "Help", help_path %></li>
          <% if signed_in? %>
            <li><%= link_to "Users", users_path %></li>
            <li id="fat-menu" class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                Account <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
                <li><%= link_to "Profile", current_user %></li>
                <li><%= link_to "Settings", edit_user_path(current_user) %></li>
                <li class="divider"></li>
                <li>
                  <%= link_to "Sign out", signout_path, method: "delete" %>
                </li>
              </ul>
            </li>
          <% else %>
            <li><%= link_to "Sign in", signin_path %></li>
          <% end %>
        </ul>
      </nav>
    </div>
  </div>
</header> 

会话控制器:

class SessionsController < ApplicationController

  def new
      @user = User.new

      respond_to do |format|
        format.html # new.html.erb
        format.json { render json: @user }
      end
    end

  def create
     user = User.find_by_email(params[:session][:email].downcase)
     if user && user.authenticate(params[:session][:password])
       sign_in user
       redirect_back_or user
     else
       flash.now[:error] = 'Invalid email/password combination'
       render 'new'
     end
   end

    def destroy
      sign_out
      redirect_to root_url
    end
end

会话助手:

module SessionsHelper

  def sign_in(user)
    cookies.permanent[:remember_token] = user.remember_token
    self.current_user = user
  end

  def signed_in?
    !current_user.nil?
  end

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

   def current_user=(user)
      @current_user = user
   end

   def current_user
     @current_user ||= User.find_by_remember_token(cookies[:remember_token])
   end

   def current_user?(user)
     user == current_user
   end

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

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

  def remember_token
     cookies.signed[:remember_token] || [nil,nil]
  end

登录表格/会话#new

<% provide(:title, "Sign in") %>
<h1>Sign in</h1>


<div class="row">
  <div class="span6 offset3">
    <%= form_for(:session, url: sessions_path) do |f| %>

      <%= f.label :email %>
      <%= f.text_field :email %>

      <%= f.label :password %>
      <%= f.password_field :password %>

      <%= f.submit "Sign in", class: "btn btn-large btn-primary" %>
    <% end %>

    <p>New user? <%= link_to "Sign up now!", signup_path %></p>
  </div>
</div>

如果我可以提供任何其他控制器/视图/模型,请告诉我,我会相应地更新帖子!

谢谢。

4

1 回答 1

0

查看会话控制器中的这一行:

redirect_back_or user

以及相应的辅助方法:

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

看起来会话变量session[:return_to]没有被设置,因为它返回 false(或 nil)导致重定向到@user.

在执行任何身份验证魔术之前,您应该调用store_location帮助程序来设置此会话变量。要么将它放在create动作的顶部,要么使用before_filter.


请注意,在不检查现有值的情况下进行store_location覆盖。session[:return_to]如果用户输入了错误的密码并再次呈现登录页面,它会将登录页面存储为“返回”位置。然后,成功的身份验证将重定向回登录页面。

要解决此问题,请使用条件赋值:

def store_location
  session[:return_to] ||= request.url
end
于 2013-04-26T03:13:11.657 回答