Урок по Ruby on Rails, урок 9 - PullRequest
       1

Урок по Ruby on Rails, урок 9

0 голосов
/ 21 апреля 2011

Обновление: суббота, 23 апреля 2011 г.

Урок становится зеленым после выполнения следующего в user.rb

def authenticate_with_salt(id, cookie_salt)
  user = find_by_id(id)
  (user && user.salt == cookie_salt) ? user : nil 
end

Я получаю:

Failures:

  1) SessionsController POST 'create' success should sign the user in
     Failure/Error: controller.current_user.should == @user
     ArgumentError:
       wrong number of arguments (1 for 2)
     # ./app/models/user.rb:45:in `authenticate_with_salt'
     # ./app/helpers/sessions_helper.rb:36:in `user_from_remember_token'
     # ./app/helpers/sessions_helper.rb:14:in `current_user'
     # ./spec/controllers/sessions_controller_spec.rb:58:in `block (4 levels) in <top (required)>'

Finished in 0.54296 seconds
7 examples, 1 failure

Я продолжаю исследовать ... о, радость! : D

РЕДАКТИРОВАТЬ: Работая над завершением урока 9, затем опубликую здесь - кажется, что я снова на пути к поиску проблемы самостоятельно благодаря GrahamJRoy!

Обновление пятница, 22 апреля 2011 г .:

Я провел последний день, пытаясь найти подобную проблему, но безуспешно. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать, оба сбоя, скорее всего, связаны друг с другом, поэтому, если я исправлю один, я думаю, что это исправит другой

Failures:

  1) SessionsController POST 'create' success should sign the user in
     Failure/Error: post :create, :session => @attr
     NameError:
       undefined local variable or method `clear_return_to' for #<SessionsController:0x00000101648ac8>
     # ./app/helpers/sessions_helper.rb:28:in `redirect_back_or'
     # ./app/controllers/sessions_controller.rb:16:in `create'
     # ./spec/controllers/sessions_controller_spec.rb:51:in `block (4 levels) in <top (required)>'

  2) SessionsController POST 'create' success should redirect to the user show page
     Failure/Error: post :create, :session => @attr
     NameError:
       undefined local variable or method `clear_return_to' for #<SessionsController:0x00000100ea0690>
     # ./app/helpers/sessions_helper.rb:28:in `redirect_back_or'
     # ./app/controllers/sessions_controller.rb:16:in `create'
     # ./spec/controllers/sessions_controller_spec.rb:57:in `block (4 levels) in <top (required)>'

Finished in 0.42858 seconds
7 examples, 2 failures

В файлах сессий helper.rb:

  def redirect_back_or(default)
    redirect_to(session[:return_to] || default)
    clear_return_to
  end

В файле session_controller_spec.rb:

  it "should sign the user in" do
     post :create, :session => @attr
     controller.current_user.should == @user
     controller.should be_signed_in
   end

  it "should redirect to the user show page" do
     post :create, :session => @attr
     response.should redirect_to(user_path(@user))
   end


In sessions_controller.rb file:

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

Оригинальная проблема ниже:


В настоящее время я работаю в уроке 9 над учебником по Ruby on Rails и получаю следующую ошибку при запуске автотеста:

Неудачи:

  1) SessionsController POST 'create' success should sign the user in
     Failure/Error: post :create, :session => @attr
     NoMethodError:
       undefined method `sign_in' for #<SessionsController:0x000001017082d8>
     # ./app/controllers/sessions_controller.rb:15:in `create'
     # ./spec/controllers/sessions_controller_spec.rb:51:in `block (4 levels) in <top (required)>'

  2) SessionsController POST 'create' success should redirect to the user show page
     Failure/Error: post :create, :session => @attr
     NoMethodError:
       undefined method `sign_in' for #<SessionsController:0x00000100ecbca0>
     # ./app/controllers/sessions_controller.rb:15:in `create'
     # ./spec/controllers/sessions_controller_spec.rb:57:in `block (4 levels) in <top (required)>'

sessions_controller_spec.rb:

  it "should sign the user in" do
    post :create, :session => @attr
    controller.current_user.should == @user
    controller.should be_signed_in
  end

  it "should redirect to the user show page" do
    post :create, :session => @attr
    response.should redirect_to(user_path(@user))
  end

ЕСЛИ я закомментирую вышеуказанный session_controller_spec.rb, я буду ЗЕЛЕНЫМ! Возможно, это поможет кому-то направить меня в правильном направлении, поскольку я ничего не понимаю!

sessions_controller.rb:

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

sessions_helper.rb:

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

ДОБАВЛЕНО для GrahamJRoy 'include SessionsHelper' в application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery
  include SessionsHelper
end

2 новых ошибки, которые, я думаю, приводят к моей проблеме:

Неудачи:

  1) SessionsController POST 'create' success should sign the user in
     Failure/Error: post :create, :session => @attr
     NoMethodError:
       undefined method `redirect_back_or' for #<SessionsController:0x0000010405adc0>
     # ./app/controllers/sessions_controller.rb:16:in `create'
     # ./spec/controllers/sessions_controller_spec.rb:51:in `block (4 levels) in <top (required)>'

  2) SessionsController POST 'create' success should redirect to the user show page
     Failure/Error: post :create, :session => @attr
     NoMethodError:
       undefined method `redirect_back_or' for #<SessionsController:0x000001030a3c60>
     # ./app/controllers/sessions_controller.rb:16:in `create'
     # ./spec/controllers/sessions_controller_spec.rb:57:in `block (4 levels) in <top (required)>'

Ответы [ 2 ]

5 голосов
/ 21 апреля 2011

Согласно документации, вы ссылались на SessionsHelper в ApplicationController?

class ApplicationController < ActionController::Base
  protect_from_forgery
  include SessionsHelper
end
0 голосов
/ 23 апреля 2011

Таким образом, я в основном отступил и начал урок снова и тщательно прокомментировал код на каждой странице, которого там быть не должно.

Мое субботнее обновление, приведенное выше, заставило меня начать проверять, что показывает сбой, поэтому я перешел к каждой упомянутой строке и проверил RailsTutorial git repo, чтобы увидеть любые очевидные различия.

Это привело к * рядом с запоминанием

User.authenticate_with_salt(*remember_token)

При добавлении * ошибка изменилась с

Failures:

  1) SessionsController POST 'create' success should sign the user in
     Failure/Error: controller.current_user.should == @user
     ArgumentError:
       wrong number of arguments (1 for 2)
     # ./app/models/user.rb:45:in `authenticate_with_salt'
     # ./app/helpers/sessions_helper.rb:36:in `user_from_remember_token'
     # ./app/helpers/sessions_helper.rb:14:in `current_user'
     # ./spec/controllers/sessions_controller_spec.rb:58:in `block (4 levels) in <top (required)>'

Finished in 0.54296 seconds
7 examples, 1 failure

до:

Failures:

  1) SessionsController POST 'create' success should sign the user in
     Failure/Error: controller.should be_signed_in
     NoMethodError:
       undefined method `signed_in?' for #<SessionsController:0x00000104086088>
     # ./spec/controllers/sessions_controller_spec.rb:59:in `block (4 levels) in <top (required)>'

Finished in 1.73 seconds
63 examples, 1 failure

В этот момент я проверил свой код:

  def signed_in
    !current_user.nil?
  end

в git repoos:

  def signed_in?
    !current_user.nil?
  end

И удобно увидел '?' Пропустив, что я рассчитывал, я бы добавил, и посмотреть, что произойдет ..

И, видимо, теперь я зеленый ... давай сейчас закончим этот урок!

Большое спасибо GrahamJRoy за ваш вклад!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...