【问题标题】:Trying to create user sessions -- > No route matches {:action=>"show", :controller=>"users", :id=>nil}尝试创建用户会话 --> 没有路由匹配 {:action=>"show", :controller=>"users", :id=>nil}
【发布时间】:2012-09-30 12:42:06
【问题描述】:

在完成 Michael Hart 的 Rails 教程后,我正在尝试自己制作一个简单的应用程序。

我设法创建了用户资源,现在正在尝试创建会话资源,以跟踪某人何时登录。我得到了一些非常古怪的结果。

1) 我试图为某人登录和注销时显示不同的菜单选项。它有效,只是它的行为与我预期的相反!即当我写

        <ul class="nav pull-right">
          <% if signed_in? %>
               #menu for registered users
          <% else %>
               #menu for unregistered users             
          <% end %>
        </ul>

当我登录时,未注册用户的#menu 出现,当我退出时,注册用户的#menu 出现。

2) 我也在尝试创建一个指向用户管理页面的链接,该页面基本上是用户的 id 页面。

我把它作为下面的链接代码

<%= link_to "Admin", user_path(current_user) %>

得到了错误

没有路由匹配 {:action=>"show", :controller=>"users", :id=>nil}

这让我觉得我在会话助手中定义的 current_user 没有被保存,但比我想象的要好,但我不确定为什么。

这是我的代码 用户模型

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation
  has_secure_password

  before_save { |user| user.email = email.downcase }
  before_save :create_remember_token

  validates :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 :password, presence: true, length: { minimum: 6 }
  validates :password_confirmation, presence: true

  private

        def create_remember_token
          self.remember_token = SecureRandom.urlsafe_base64
        end

end

会话控制器

class SessionsController < ApplicationController

def new
end

def create
    user = User.find_by_email(params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
        sign_in user
        redirect_to user
    else
        flash.now[:error] = 'Invalid Email/Password Combination' #Not quite right; 
        render 'new'
    end
end

结束

SessionsHelper

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 current_user=(user)
    @current_user = user
  end

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

应用控制器

class ApplicationController < ActionController::Base
  protect_from_forgery
  include SessionsHelper
end

想法?

【问题讨论】:

  • 您的 current_user 为零。检查为什么您的 current_user 为空。可能是登录时没有设置会话变量
  • 嗨 Mohit,感谢您的评论 > 可能是登录时未设置会话变量我该如何检查?
  • 在你的 create 方法中抛出一个调试器,看看 session 变量有什么可用的。
  • 感谢大家的帮助!似乎我有两个错误——1)当用户在用户控制器中注册时我没有登录用户,2)我没有重新启动服务器,并执行 db:reset。尝试后,其他与注销不起作用有关的问题已修复。

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

感谢大家的帮助!似乎我有两个错误——1)当用户在用户控制器中注册时我没有登录用户,2)我没有重新启动服务器,并执行 db:reset。尝试后,其他与注销不起作用有关的问题已修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2012-11-18
    • 2011-12-25
    • 2012-07-22
    • 1970-01-01
    • 2018-09-22
    • 2011-05-06
    相关资源
    最近更新 更多