Метод find_by_* не возвращает объект

Я пытаюсь настроить простую аутентификацию для моего приложения rails. У меня есть каркас security_users, и я создал несколько пользователей.

Когда я пытаюсь войти в систему, используя некоторые из этих учетных записей, мне кажется, что метод «find_by_*» не может обнаружить текущую.

Вот как выглядит мой контроллер сеанса (я прокомментировал проверку пароля, чтобы отладить проблему):

class SessionsController < ApplicationController

  def new
  end

  def create
    @security_user = SecurityUser.find_by_email(params[:email])
    if @security_user #&& @security_user.authenticate(params[:password])
      session[:security_user_id] = @security_user.id
      redirect_to root_url, notice: "Logged in!"
    else
      flash.now.alert = "Email or password is invalid"
      render 'new'
    end
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_url, notice: "Logged out!"
  end
end

Итак, когда я пытаюсь создать сеанс (для входа в систему), я перенаправляюсь на «новый» шаблон сеанса. Это отладочная информация:

введите здесь описание изображения

что вроде бы все в порядке. Почему следующий оператор не смог найти запись:

SecurityUser.find_by_email(params[:email])

РЕДАКТИРОВАТЬ:

Когда я ввел строку выше в консоли, она возвращает запись:

введите здесь описание изображения


person gotqn    schedule 09.06.2013    source источник
comment
какую ошибку вы получаете?   -  person Rinku    schedule 09.06.2013
comment
@Rinku Я не получаю никаких ошибок - помощник (find_by_email) не может найти пользователя, и из-за этого сеанс не может быть создан.   -  person gotqn    schedule 09.06.2013
comment
hv u проверил это с помощью консоли rails? Вы можете получить его там?   -  person Rinku    schedule 09.06.2013
comment
@Rinku Да, я обновил вопрос - там метод работает.   -  person gotqn    schedule 09.06.2013
comment
Вы правильно получаете электронную почту в параметрах? Вы проверили это?   -  person Rinku    schedule 09.06.2013
comment
У меня есть параметры отладки вызова в новом частичном сеансе, и, как вы можете видеть на скриншоте из моего вопроса, значение электронной почты верное.   -  person gotqn    schedule 09.06.2013
comment
давайте продолжим это обсуждение в чате   -  person gotqn    schedule 09.06.2013


Ответы (1)


Во-первых, если это не простое упражнение в аутентификации Rails, на этом этапе вам следует использовать Devise или AuthLogic.

Во-вторых, вы уверены, что params[:email] содержит адрес электронной почты, который вы ищете? Судя по вашим параметрам, мне кажется, что вы хотите использовать params[:session][:email].

В-третьих, вы должны переместить это в модель. Например:

class SecurityUser < ActiveRecord::Base
  def self.authenticate(params)
    user = where(email: params[:email]).first
    (user && user.password == params[:password]) ? user : false
  end
end

И в контроллере:

@user = SecurityUser.authenticate params[:session]
session[:user_id] = user.id if @user

Обратите внимание, что пароль не хэшируется — вы не должны сохранять пароль в виде простого текста — но это не то, о чем идет речь.

Также обратите внимание, что теперь вы должны использовать where().first вместо find_by.

person davidfurber    schedule 09.06.2013
comment
Да, это был [:session][:email] - это вызывало проблему. Я не использую готовые решения, такие как Devise, чтобы запустить, как сделать что-то самому. Почему мне нужно переместить это в мою модель вместо использования метода аутентификации. Кроме того, пароль не сохраняется в виде обычного текста — я использую bcrypt. - person gotqn; 09.06.2013