air*_*n19 0 ruby authentication hash symbols ruby-on-rails
我正在尝试在Rails中实现一个简单的登录系统,但是当我尝试显示登录用户的用户名时,我收到此错误:
can't convert Symbol into Integer
Extracted source (around line #60):
57: </ul>
58: <% if session[:logged_in] %>
59: <% user = session[:user] %>
60: <p class="pull-right">Howdy, <strong><%= user[:username] %></strong>!</p>
61: <% end %>
62: </div>
63: </div>
Run Code Online (Sandbox Code Playgroud)
我的型号代码在这里:
require 'digest'
class User < ActiveRecord::Base
before_save {|user| user.password = Digest::SHA1.hexdigest(user.password)}
attr_accessible :username, :password, :email
validates_length_of :username, :password, :minimum => 7
validates_presence_of :username,:password,:email, :on => :create
validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
end
Run Code Online (Sandbox Code Playgroud)
这就是我设置session [:user]的方式:
def create
if User.find(:all, :conditions => {:username => params[:username], :password => Digest::SHA1.hexdigest(params[:username])})
user = User.find(:all, :conditions => {:username => params[:username], :password => Digest::SHA1.hexdigest(params[:password])})
session[:user] = user
session[:logged_in] = true
redirect_to(:root, :notice => "Thanks for logging in!")
else
redirect_to(:new, :notice => "You supplied an invalid username/password combination.")
end
end
Run Code Online (Sandbox Code Playgroud)
可能session[:user]不像你期望的那样是哈希,而是一个数组.因此,使用除整数之外的任何内容来订阅它是无效的.
如何解决这个问题?更改实际设置会话变量的代码(如session[:user] = XYZ).
编辑: User.find(:all, ...)返回一个数组,所以我假设你正在分配一个数组session[:user].您应该只分配找到的第一个用户(事实上,应该只有一个符合条件).更好的是,您应该只在会话中存储用户名,并在需要时从数据库中获取它:
def create
user = User.where(:username => params[:username], :password => Digest::SHA1.hexdigest(params[:username])).first
if user
session[:user_id] = user.id
else
redirect_to(:new, :notice => "You supplied an invalid username/password combination.")
end
end
Run Code Online (Sandbox Code Playgroud)
然后在与您的视图关联的操作中:
def ...
@user = User.find(session[:user_id])
unless @user
# redirect to error page, user was deleted in the meantime
end
end
Run Code Online (Sandbox Code Playgroud)
然后在视图中:
<%= @user.username %>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2203 次 |
| 最近记录: |