#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