Ruby on Rails — застрял в главе 9.3.3 книги Hartl, неопределенный метод sign_in

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Я работаю над 9.3.3 книги Hartl и продолжаю застревать с

неопределенный метод `sign_in’ для SessionsController: 0x00000100c0da90

Я знаю, что это потому, что метод sign_in находится в файле sessions_helper, который выбирается моделью, а не контроллером. Книга Hartl не требует строки «включить SessionsHelper».

Если я добавлю этот хак, который, как я предполагаю, я не должен, это приведет к тому, что я получу другую ошибку undefined method current_user

Вот код

SessionsController.rb

 class SessionsController < ApplicationController

  def new
    @title = "Sign in"
  end

  def create
    user = User.authenticate( params[:session][:email],
                              params[:session][:password])
     if user.nil?
       flash.now[:error] = "Invalid email/password combo."
       @title = "Sign in"
       render 'new'
     else
       sign_in user
       redirect_to user
     end 

 end

  def destroy
  end 
  

и для sessions_helper.rb

   module SessionsHelper

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

Ответ №1:

в контроллере приложения должен быть «включить SessionsHelper». По умолчанию помощники включены в представления, но для использования помощника в контроллере он должен быть включен явно.

Комментарии:

1. Спасибо! Да, я не знаю, как я пропустил это поле. Спасибо!

Ответ №2:

Если вы уже включили SessionsHelper в свой application_controller и все еще получаете эту ошибку при сбое теста:

Если вы обновили свой файл spec / support / utilities.rb в упражнениях, ранее приведенных в главе 8, и использовали приведенный пример, есть большая вероятность, что вы создали метод «sign_in», но назвали его «valid_signin» на основе примера в упражнении главы 8, а не в листинге 9.6, где он называется просто «sign_in». Надеюсь, это поможет.

Также это основано на 2-м издании руководства, но, как я полагаю, все равно должно применяться к 1-му.

Ответ №3:

Также стоит добавить, что вам нужно быть осторожным, чтобы не запутаться с помощником sign_in, написанным в модуле SessionsHelper, и sign_in, записанным в файле spec / support / utilities.rb. Одно и то же имя, но две разные функции. В тестах вызывается тот, который записан в файле utilities.rb (листинг 9.6) и выглядит следующим образом:

 def sign_in(user)
  visit signin_path
  fill_in "Email",      with: user.email
  fill_in "Password",   with: user.password
  click_button "Sign in"
  #sign in when not using capybara as well
  cookies[:remember_token] = user.remember_token
end
  

Ответ №4:

Разве вам не нужно include SessionsHelper в вашем ApplicationController? (См. 9.11 в книге), а затем определить current_user в нем (листинг 9.14)?

Ответ №5:

Ошибка, которую я допустил, заключалась в том, что я никогда не помещал файл utilities.rb в подпапку support