Невозможно преобразовать символ в целое число - PullRequest
0 голосов
/ 11 февраля 2012

Я пытаюсь реализовать простую систему входа в 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>

Код моей модели здесь:

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

Вот так я устанавливаю сессию [: 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

Ответы [ 2 ]

5 голосов
/ 11 февраля 2012

Вероятно, session[:user] - это не Hash, как вы ожидаете, а массив.Таким образом, подписка на него чем-либо, кроме целого числа, недопустима.

Как это исправить?Измените код, который фактически устанавливает переменную сеанса (например, session[:user] = XYZ).

EDIT: 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

Затем в действии, связанном с вашим представлением:

def ...
  @user = User.find(session[:user_id])
  unless @user
    # redirect to error page, user was deleted in the meantime
  end
end

Затем ввид:

<%= @user.username %>
1 голос
/ 11 февраля 2012

Выгрузка всего объекта User в ваш сеанс - плохая идея, и, вероятно, поэтому вы не получаете того, что ожидаете. Вы должны реализовать что-то вроде #to_session в своем классе User, который возвращает хеш с минимально необходимой информацией. Что-то вроде:

def to_session
  {:id => id, :username => username, :email => email}
end

Затем, когда вы установите сеанс:

session[:user] = user.to_session
...