sign_in できない問題

某所で Ruby on Rails チュートリアル を使って実習なナニをヤらせて頂いてるのですが、標題の問題が出てたりしてます。
何が原因なのか分からない上に、現時点の状態を Github に push してもらうのを忘れていたり。仕方が無いので中身を掘ってみることにします。8 章な commit を取り出せば良いのかどうか。
branch は sign-in-out な模様。自分持ちのリポジトリをローカルにコピィしてログを確認。このあたりなのか。

commit 071c43b9673f354457edf30b111434ca45a0b3ed
Merge: f547dae d4e1ef3
Author: YAMANE Toshiaki <yamanetoshi@gmail.com>
Date:   Sat Jan 26 08:23:59 2013 +0900

    Merge branch 'sign-in-out'

とりあえずこの commit を checkout して中身確認か。念のために branch 作るか。

$ git checkout -b test

で、以下かな。

$ bundle install
$ bundle exec rake db:migrate
$ bundle exec rake db:test:prepare
$ bundle exec rspec spec/

とりあえず掘削の始点は signup するあたりなのかどうか。

あらら

therubyracer な install で微妙なメセジが出力されておる。

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /Users/rms/.rbenv/versions/1.9.3-p448/bin/ruby extconf.rb 
checking for main() in -lpthread... yes
checking for main() in -lobjc... yes
creating Makefile

make
compiling accessor.cc
compiling array.cc
compiling backref.cc
backref.cc: In member function ‘v8::Handle<v8::Value> rr::Backref::toExternal()’:
backref.cc:35: error: ‘Wrap’ is not a member of ‘v8::External’
make: *** [backref.o] Error 1


Gem files will remain installed in /Users/rms/.rbenv/versions/1.9.3-p448/lib/ruby/gems/1.9.1/gems/therubyracer-0.11.2 for inspection.
Results logged to /Users/rms/.rbenv/versions/1.9.3-p448/lib/ruby/gems/1.9.1/gems/therubyracer-0.11.2/ext/v8/gem_make.out

An error occurred while installing therubyracer (0.11.2), and Bundler cannot continue.
Make sure that `gem install therubyracer -v '0.11.2'` succeeds before bundling.

何スかこれ。とりあえず手動で gem install してみましたが挙動変わらず。記述を以下にしてみるか。

  gem 'therubyracer', :platforms => :ruby

を、できた。これ、元リポジトリに盛り込んでおきたいのだけれど、どうすりゃ良いのかな。

閑話休題

ローカルな DB の用意をして試験を実行。

$ bundle exec rspec spec
Rack::File headers parameter replaces cache_control after Rack 1.5.
/Users/rms/Dropbox/kbc/RubyonRailsTutorial3/app/controllers/application_controller.rb:3:in `<class:ApplicationController>': uninitialized constant ApplicationController::SessionsHelper (NameError)

ぐぬぬ。rails c して云々が必要なのだったかな。でもそれって development なナニだしな。つうかこれって SessionHelper が、って SessionHelper が無いぞorz

仕方無いので

一番最新な commit で云々することに。不思議なことに最新には sessions_helper.rb が存在している。どの commit で追加されたか不明。何だそれ。とりあえず始点は app/views/users/new.html.erb ってことにします。掘削開始。
ええと、これって users を POST するって理解で以下な route になるんかな。

         users GET    /users(.:format)               users#index
               POST   /users(.:format)               users#create

UsersController の create な action の定義が以下ですね。

  def create
    @user = User.new(params[:user])
    if @user.save
      sign_in @user
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      render 'new'
    end
  end

User なオブジェクトを生成して保存した後に sign_in を呼び出してます。あるいは sigin_in の form はどれにあたるのかな。app/views/sessions/new.html.erb なのか。ここ発の route は以下ってことで良いのかな。

      sessions POST   /sessions(.:format)            sessions#create

つう事は SessionsController の create な action になるのかどうか。定義が以下。

  def create
    user = User.find_by_email(params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      sign_in user
      redirect_back_or user
    else
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    end
  end

こちらは登録済みのはずなので find して認証云々なのか。ただ、今日拝見させて頂いたところでは SessionsController#create からは sign_in は呼び出されていました。
ここまでパースというか掘削する方法は当人な方々に話をしてさしあげた方が良いかも。

保険

ここまで確認して異常が見当たらない場合、どうするべきか。

  • とりあえず現状な branch はリモートに push してもらう
  • パスしていない試験がどれだったか分からんぞorz

掘削しつつ、現場デバッグになるのかどうかw