読者です 読者をやめる 読者になる 読者になる

scramble cadenza

技術ネタのガラクタ置き場

rails 5 を今更触ってみた話

authlogic rails ruby rspec

イントロ

rails5 の主要機能は色々と知られている通りだけど、業務に投入するとなると、やっぱり互換性だったり、細かいコードの違いが気になるもの。

今回 authlogic を使ったログイン機能を雑に作ったので、その限られた狭い範囲であるものの、ハマったところや違いをまとめてみた。

なんで authlogic ?

  • 昔業務で使ってたから。そしてまた使うかもしれない。
    • なお devise は初心者の頃使って見事に爆死し、それ以降使ってない。
  • そこそこ古く、歴史ある gem
  • シンプルな機能だけを提供してくれている
    • だから好き。
    • (ただし、中身はかなり癖のある実装)
  • 昔のおさらい。復習を兼ねて。

環境

  • rails (5.0.0.rc2)
  • authlogic (3.4.6)
  • rspec-core (3.1.7)

気づいたこと

authlogic は rails5 対応中

結論から言うと、今は使えなかった。
しかし対応 PR や issue も立っているので、しばらく傍観モード。

全くメンテナンスされていないわけではなさそうなので、少し安心した。

サンプルを作成する時には、vendor/bundle 以下に install されている authlogic を直接修正して、無理やり動かすことになってしまった。

トップページが….

初めて rails s して localhost:3000 にアクセスするとこんな感じ。かっこいい。

f:id:mgi:20160626180707p:plain

ログを見ると以下のようになっている。

Started GET "/" for 127.0.0.1 at 2016-06-25 22:55:12 +0900
  ActiveRecord::SchemaMigration Load (0.6ms)  SELECT "schema_migrations".* FROM "schema_migrations"
Processing by Rails::WelcomeController#index as HTML
  Parameters: {"internal"=>true}
  Rendering vendor/bundle/gems/railties-5.0.0.rc2/lib/rails/templates/rails/welcome/index.html.erb
  Rendered vendor/bundle/gems/railties-5.0.0.rc2/lib/rails/templates/rails/welcome/index.html.erb (4.5ms)
Completed 200 OK in 24ms (Views: 11.3ms | ActiveRecord: 0.0ms)

Rails::WelcomeController#index というのが呼ばれている。 書き換えたいときは今までどおり、root を設定すればいいっぽい。

controller のテストが rails-controller-testing に切り出されている

assigns が使えなくて、scaffold で作ったテストが NoMethodError で落ちる。 assigns を使いたければ rails/rails-controller-testing を各自で install して使う仕組みになったようだ。(対応したのはもっと昔なのだろうけど、知らなかった)

rspecminitest とは違って、全部まるごと入ってるのが嬉しいから、個人的にはちょっと残念。今後の方針がどうなるかは知らないけど、テストのために色々な gem を探したり install するのは大変だし、面倒だと思う。その面倒さが無いのが一番の利点だと思ってたので。*1

prepend_before_filter が deprecated

authlogic の内部で書かれている。 なので bundler で環境を読み込むたび出てくるので鬱陶しい。

$ rails c
DEPRECATION WARNING: prepend_before_filter is deprecated and will be removed in Rails 5.1. Use prepend_before_action instead. (called from require at /Users/argerich/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/bundler-1.11.2/lib/bundler/runtime.rb:77)
Loading development environment (Rails 5.0.0.rc2)
>>

メッセージにも書いてあるとおり、prepend_before_action を使えば警告を解消できそう。

Fix deprecation warning: prepend_before_filter in Rails 5 by bparanj · Pull Request #491 · binarylogic/authlogic

use_transactional_fixtures が deprecated

rspec-railsuse_transactional_fixtures が deprecated になっている模様。 代わりに use_transactional_tests= を使えとあるけど、rspec-3.1.7 では対応されておらず、NoMethodError で弾き返される。

$ rspec
…
DEPRECATION WARNING: use_transactional_fixtures= is deprecated and will be removed from Rails 5.1 (use use_transactional_tests= instead) (called from <top (required)> at /Users/argerich/dev/authlogic-rails5-example/spec/controllers/top_controller_spec.rb:3)
DEPRECATION WARNING: use_transactional_fixtures= is deprecated and will be removed from Rails 5.1 (use use_transactional_tests= instead) (called from <top (required)> at /Users/argerich/dev/authlogic-rails5-example/spec/controllers/user_sessions_controller_spec.rb:3)
DEPRECATION WARNING: use_transactional_fixtures= is deprecated and will be removed from Rails 5.1 (use use_transactional_tests= instead) (called from <top (required)> at /Users/argerich/dev/authlogic-rails5-example/spec/controllers/users_controller_spec.rb:21)
DEPRECATION WARNING: use_transactional_fixtures= is deprecated and will be removed from Rails 5.1 (use use_transactional_tests= instead) (called from <top (required)> at /Users/argerich/dev/authlogic-rails5-example/spec/models/user_spec.rb:3)
DEPRECATION WARNING: use_transactional_fixtures= is deprecated and will be removed from Rails 5.1 (use use_transactional_tests= instead) (called from <top (required)> at /Users/argerich/dev/authlogic-rails5-example/spec/requests/users_spec.rb:3)
…

Deprecation warning: use_transactional_fixtures= is deprecated · Issue #1549 · rspec/rspec-rails を見ると、master branch では対応しているっぽい。

ActionController::TestCase

get url, parameter, session でお馴染みの、リクエストを送るメソッドの引数が、HTTP method だけになる模様。

get :show, params: { id: 1 }, session: { user_id: 1 }
process :update, method: :post, params: { id: 1 }
 (called from block (3 levels) in <top (required)> at /Users/argerich/dev/authlogic-rails5-example/spec/controllers/users_controller_spec.rb:57)
DEPRECATION WARNING: ActionController::TestCase HTTP request methods will accept only
keyword arguments in future Rails versions.

具体的には、以下の様な修正を行えばおk。
引数に名前がついて、わかりやすくなった。地味に嬉しい。

しかし、これは多分運用しているテストを直さないといけなくなるのかなー。

--- a/spec/controllers/users_controller_spec.rb
+++ b/spec/controllers/users_controller_spec.rb
@@ -60,7 +60,7 @@ RSpec.describe UsersController, :type => :controller do

   describe "GET new" do
     it "assigns a new user as @user" do
-      get :new, {}, valid_session
+      get :new, params: {}, session: valid_session
       expect(assigns(:user)).to be_a_new(User)
     end
   end

ログが綺麗になってる

前はもっと asset 周りのログが沢山流れていたが、今は出ない。
すっきり。

Started GET "/" for 127.0.0.1 at 2016-06-26 00:09:06 +0900
Processing by TopController#index as HTML
  Rendering top/index.html.erb within layouts/application
  Rendered top/index.html.erb within layouts/application (11.4ms)
Completed 200 OK in 40ms (Views: 34.7ms | ActiveRecord: 3.1ms)


Started GET "/login" for 127.0.0.1 at 2016-06-26 00:09:12 +0900
Processing by UserSessionsController#new as HTML
  Rendering user_sessions/new.html.erb within layouts/application
  Rendered user_sessions/new.html.erb within layouts/application (3.9ms)
Completed 200 OK in 66ms (Views: 64.3ms | ActiveRecord: 0.0ms)

last_comment が deprecated

Rake.application.last_comment が deprecated らしい。 rspec-core3.1.7 では、ここRake.application.last_comment が使われていて、警告が出る。

 % rake
DEPRECATION WARNING: prepend_before_filter is deprecated and will be removed in Rails 5.1. Use prepend_before_action instead. (called from require at /Users/argerich/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/bundler-1.11.2/lib/bundler/runtime.rb:77)
[DEPRECATION] `last_comment` is deprecated.  Please use `last_description` instead.
[DEPRECATION] `last_comment` is deprecated.  Please use `last_description` instead.
[DEPRECATION] `last_comment` is deprecated.  Please use `last_description` instead.
[DEPRECATION] `last_comment` is deprecated.  Please use `last_description` instead.

last_description に書き換えると警告が止まる。 確認はしてないが、master なら治ってそう。

まとめ

休日の空いてる時間で、雑に作ったものですが、できあがったものはこちらです。

mgi166/authlogic-rails5-example: authlogic meets rails 5

*1:もっとも、最近では controller のテストではなく request のテストを書く事が多いだろうと思われるが