仮免プログラマの軌跡

Android 端末だけで Android アプリを作ったり、技術やガジェットネタをぽつぽつと

スポンサーリンク

Web アプリケーション開発初心者が Rails 入門書(Rails3 対応)を Rails4.2 で試したら躓きまくった件

スポンサーリンク

 タイトル通り、Rails 初心者の私がバージョン違いや凡ミスによりあたふたしたことをまとめた、ためになる様でならないメモ書きです。だらだらと長めの話なので、目次を置いておくことにしました。
 なにぶん初学者なので、間違った事を書いてたらツッコミをお願いしますm(_ _)m

目次

最初に

 この文書は特定の入門書に対する書評などではなく、ちゃんと周辺情報も調べない(というか開発環境バージョンの違いにあまりにも頓着が無かった)愚かな自分と同じ道にはまってしまった人向けのものです。ちなみに今回自分が Ruby On Rails の入門書として利用した本はこちらです。

HerokuではじめるRailsプログラミング入門

HerokuではじめるRailsプログラミング入門

 元を辿ると、「そろそろプログラマの端くれとして、軽くでもいいから Web アプリの作り方を学んでおこう」と思い立った際に、ネットで色々と調べてみると「自分としては Ruby On Rails がとっつきやすそう」という結論に至り、上記の入門書を手にしました。本の内容としては、Rails3 を対象にしている点を除けば(もちろん書かれた時点では3なので無茶な話ですが)入門書としての不満はない良い本だと思います。WindowsMac の両環境でのセットアップの解説や、紙面の都合上やや物足りない感はありますが Ruby の基本も書かれています。最後はちゃんと小規模な SNS を作って「こんなことできるんだぜ」ということを実感させてくれます。Heroku の利用方法についてもちゃんと書かれているので、ローカル環境ではなく実際に Web サービスとして作り上げることでちょっとした感動もありました。
 前置きが長くなりましたが、自分が躓いた部分をポツポツとポイントを絞ってメモ書きしていきます。

環境セットアップ編(Windows

 自分の偏見かもしれませんが、Web 開発現場の皆様は Mac ユーザが多い気がしていて、Windows 環境でのセットアップ方法やトラブル解決策がやや少ない印象があります。そんな鬼門になりそうな環境セットアップでやっぱりハマりました。といっても、ここら辺は自分のやり方がまずい部分もいくらかあったので自業自得かもしれません。

RubyInstaller & Development Kit のインストール編

 まずは何はなくとも Ruby をインストールしないと始まらないので、RubyInstaller for Windowsから、最新の 2.2.4 をインストールしました。書籍では 1.9.3 をインストールしていますが、「後で2系に移っても良い」との表記があったので先に2系をインストールしました。これに関しては特に問題無かったと思っています。
 さらに Development Kit とやらも導入する必要があったのでこちらもダウンロード。ここで何故か 1.9.3 対応版の Development Kit を導入するという痛恨のミスをやらかしました。「あ…ありのまま、今起こった事を話すぜ!『おれは2系の Ruby をインストールしたのに、1.9.3 対応の DevKit をインストールしていた』な…何を言っているのかわからねーと思うが、俺も何でこうなったのか分からなかった…」
 とりあえずこのあたりのミスもあって Rails のインストールが失敗した件については次の項目で書きます。

Rails のインストール編

 本を参考にする限り、本来であればコマンドプロンプトから下記のコマンドでインストールが完了するはず……。

gem install rails

 ……が、前項でのミスによる賜物か、はたまたそれ以外の要因があったかは定かではありませんが、インストールに失敗しました。取りあえずここらへんで解決方法を探るのに時間が掛かり弱い心が折れそうになりました。
 とりあえず「そもそも Development Kit と Ruby のバージョンが違うじゃない」「gem コマンド実行時に環境変数が設定されていないのでそもそもインストールに必要な環境が揃っていないんじゃない?」という2点が怪しいという結論に達しました。ということで以下を実施してみました。

  1. Ruby 2系に対応した Development Kit の導入
    (凡ミス……)
  2. RI_DEVKIT という環境変数を用意し、Development Kit のルートを値として設定
    (Kit に付属する devkitvars.bat 実行でもよい気がしますが、毎回実行するのが面倒な感じがしたので直接環境変数に設定)
  3. json が云々』というエラーメッセージがあったので、rails 導入の前に gem install json を実行
    (これは別に必須ではないのかもしれないけど、一応やったので書いておきます)

 ここら辺を実行した後に、改めて gem install rails を実行すると無事に Rails がインストールされました!……ただし実際にインストールされたのは、書籍推奨の Rails3 じゃなくて、最新の Rails4.2.5 だけどな!ちなみに書籍には「Rails 4.0 Beta 1を試した感じだと、ダイナミックファインダー以外は問題なさそう」という記述がありましたが、それ以降に色々とセキュリティ的な事情により Rails3 のコードがそのまま動かなくなっていった様です。

じゃあ、Rails3.2 系で開発を進めるためには何をする必要があったのか?

 Ruby は2系でも良くて、DevKit も該当バージョンを入れるとして、Rails をどうしておけば良かったのか?とりあえず古いバージョン(書籍推奨の 3.2 系)を入れておくのが良さそうなので、その方法をメモしておきます。参照したのは以下のサイト。

 ということで、gem install rails -v="3.2.22"(3.2.22 が 3.2 系の最新っぽいので)とやれば、何も気にせず3.2系で開発を進められたはず。ちなみに何故だか Windows 環境ではgem install rails -v="~>3.2.0"(3.2系の最新版をインストール)という指定が上手くいかなかったので、直接バージョンを指定しています。

初めてのアプリ作成→Heroku へのデプロイ編

 Rails のインストールは完了した(と本人は思い込んでいる)ので、rails new してアプリケーションを作っていくことにしましたが、これまでの凡ミスによる悪影響が徐々に具現化してきます。

実は bundler のインストールが失敗していた?ので Heroku にデプロイできなかった

 サンプルのアプリを作成した後に Heroku にデプロイしようとgit push heroku masterを実行したところ、「
Gemfile.lock ファイルが無い」と拒否されました。よくよく調べてみると Gemfile.lock は Gem の管理をしてくれる bundler が作成するようなのですが自分の手元には無い。つまり bundler が正しく動作していない疑惑……。
 ここで初めて Rails のインストール時にエラーが出ていることが発覚(遅いよ……)しました。エラーの内容をググった感じだと Ruby の Development Kit のバージョンが古いからインストールに失敗しているっぽいとの情報が得られたので、Ruby 2系の DevKit を導入して、再度 gem install railsrails new (アプリ名)を行うことで無事に Gemfile.lock が生成されて Heroku へのデプロイも完了しました。
 ちなみに bundler のインストール・動作がおかしかった時のエラー内容については保存し忘れたのですが、似たようなエラー内容がググったら見つかったので転載させて頂きます。

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

C:/Ruby22/bin/ruby.exe -r ./siteconf20150330-3228-14rr5u2.rb extconf.rb
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
generating byebug-i386-mingw32.def
compiling breakpoint.c
cc1.exe: warnings being treated as errors
In file included from c:/Ruby22/include/ruby-2.2.0/ruby/defines.h:163:0,
from c:/Ruby22/include/ruby-2.2.0/ruby/ruby.h:29,
from c:/Ruby22/include/ruby-2.2.0/ruby.h:33,
from ./byebug.h:4,
from breakpoint.c:1:
c:/Ruby22/include/ruby-2.2.0/ruby/win32.h:319:44: error: 'struct timespec' declared inside parameter list
c:/Ruby22/include/ruby-2.2.0/ruby/win32.h:319:44: error: its scope is only this definition or declaration, which is probably not what you want
c:/Ruby22/include/ruby-2.2.0/ruby/win32.h:320:43: error: 'struct timespec' declared inside parameter list
make: *** [breakpoint.o] Error 1

make failed, exit code 2

Gem files will remain installed in C:/Ruby22/lib/ruby/gems/2.2.0/gems/byebug-4.0.4 for inspection.
Results logged to C:/Ruby22/lib/ruby/gems/2.2.0/extensions/x86-mingw32/2.2.0/byebug-4.0.4/gem_make.out
An error occurred while installing byebug (4.0.4), and Bundler cannot continue.
Make sure that `gem install byebug -v '4.0.4'` succeeds before bundling.

C:\Users\Sander ten Brinke\Google Drive\Windesheim\Projecten\Ruby>gem install byebug -v '4.0.4'
Temporarily enhancing PATH to include DevKit...
Building native extensions. This could take a while...
ERROR: Error installing byebug:
ERROR: Failed to build gem native extension.

C:/Ruby22/bin/ruby.exe -r ./siteconf20150330-4916-pj1c1g.rb extconf.rb
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
generating byebug-i386-mingw32.def
compiling breakpoint.c
cc1.exe: warnings being treated as errors
In file included from c:/Ruby22/include/ruby-2.2.0/ruby/defines.h:163:0,
from c:/Ruby22/include/ruby-2.2.0/ruby/ruby.h:29,
from c:/Ruby22/include/ruby-2.2.0/ruby.h:33,
from ./byebug.h:4,
from breakpoint.c:1:
c:/Ruby22/include/ruby-2.2.0/ruby/win32.h:319:44: error: 'struct timespec' declared inside parameter list
c:/Ruby22/include/ruby-2.2.0/ruby/win32.h:319:44: error: its scope is only this definition or declaration, which is probably not what you want
c:/Ruby22/include/ruby-2.2.0/ruby/win32.h:320:43: error: 'struct timespec' declared inside parameter list
make: *** [breakpoint.o] Error 1

make failed, exit code 2

Gem files will remain installed in C:/Ruby22/lib/ruby/gems/2.2.0/gems/byebug-4.0.4 for inspection.
Results logged to C:/Ruby22/lib/ruby/gems/2.2.0/extensions/x86-mingw32/2.2.0/byebug-4.0.4/gem_make.out

Error during creating a new Rails application - findanycodeより引用

Heroku にデプロイしたアプリが開けない(URL が分からない)問題

Heroku にアプリをデプロイした後に早速アクセスしようとしたのですが、URL が分かりません。書籍にはhttps://api.heroku.com/appsにアクセスしてそこからアプリを辿れる、という感じで書かれていましたが、ここら辺は Heroku の仕様変更による影響か、今だと使えないようです。代わりに以下の2つの方法でアクセスできました。

  1. heroku openコマンドを実行する
    これでブラウザでアプリケーションが開けます。git を使ってデプロイしたそのままの流れで実行できるので良い感じ
  2. https://dashboard.heroku.com/apps へアクセスし、『Personal Apps』の中にある該当アプリのページを表示し、右上の『…』メニューから『open app』を選ぶ

Model へのアクセス(主に session と params の利用)、ミニ SNS サンプル作成編

 書籍の内容も後半に進み、Model を扱う様になります。さらに最後は小規模な SNS を作ることでアプリケーションを自分で作る、という体験ができるのですが、ここら辺でも色々と引っかかりました。

attr_accessible が Rails4 で利用禁止になったことによる対応

 Model のデータへのアクセス方法として attr_accessible というものが書籍内では使われていましたが、これを Rails4 で使おうとするとエラーになります。回避方法としては以下の内容を参考にしました。

 具体的には params の指定には Strong Parameters を利用して Model の new や値の参照を行っている部分を修正しました。後、session についても書籍で書かれているような session[:login].admin(ログイン中のユーザが Admin 権限を持っているかのフラグ)の様な参照ができないようになっていたので、こちらについては、

  • session[:login] にモデルの内容を保持するのではなく、ユーザの ID を保持する形に変更
    例えば、session[:current_user_id] に User Model の ID を保存する
  • 実際に User Model の変数にアクセスする時には User.find_by(id: session[:current_user_id]).adminといった感じで書く

という方針で実装することでちゃんと動作しました。
 また、attr_accessible が禁止になった背景については、上記の Qiita のコメントで言及されていて非常に勉強になります。ブラウザの開発ツールってこういうことにも使えるんだなぁ。

Rails4 だと routes.rb の match 指定の方法が限定されているのでエラーになる

 ミニ SNS の routes.rb に『メンバーのログインページ』へのパスを記述するのに書籍だとmatch '/members/login'という記述がされていますが、このままだと Rails4 ではエラーが発生します。自分は取りあえず、get '/members/login'put '/members/login' に分けて記述することで回避しました。詳しそうなページへのリンクを貼っておきます。


想定しているページへアクセスできない

 routes.rb に各種パスを記述して、ログインなどができるようになったのですがいくつかのページへアクセスする際に意図しないページにアクセスする挙動が見られました。例えば、ミニ SNS のフレンドを設定するために /members/friend?id=2 というパスにアクセスすると、何故か /members/show というパスに対してパラメータ id='friend' を渡したと認識される状態になりました。html.erb のリンクの表記にも間違いは無いし、実際に遷移するパスも間違ってい無さそう……。理解不能のまま2日程迷宮をさまよった結果、routes.rb での記述の順番が正しくなかったという結論に達したので、

resources: members
get '/members/friend'
post '/members/friend'

と書いていたところを

get '/members/friend'
post '/members/friend'
resources: members

に修正してみると、意図した通りの遷移がされました。resources が先に書かれることで、show メソッドの評価が先にされてしまって、friend はそのパラメータとして解釈されていたのだと思われます。

最終課題である『ミニ SNS』のヘッダーに存在する『ログイン状態表示』の実装方法が書かれていなかった件

 紙面の都合上かもしれませんが、書籍の通りにミニ SNS を作ると、完成図には存在するヘッダー(ログイン状態表示+ログアウト機能)が足りない状態になります。とは言うものの、ここら辺はこれまでに習った『部分テンプレート(要コード埋め込み)』を Application.html.erb に組み込んでやればサクッとできるので、これまでに習った部分の復習と考えれば良い自習課題とも言えます。

最後に

 現在は上記の書を全て読破&サンプルを写経して実行したので、次なるステップアップ用書籍として Rails4 対応の本を購入しました。こちらはまだ読んでる途中です。

Ruby on Rails 4 アプリケーションプログラミング

Ruby on Rails 4 アプリケーションプログラミング

 今回取り上げた『HerokuではじめるRailsプログラミング入門』も入門書としてはいい感じの構成(特に Ruby の簡単な解説や、Scaffold を使わずに Controller を自分で一から書いてみたり)になっていて、ちゃんと環境構築すれば問題無いはずです。自分が通ったルートは凡ミスもありあまりお勧めできませんが、Rails3 から Rails4 になって何がどういう理由で変わったのかを自分で調べて理解(一部ですが)できたので、その点に関しては良い経験になったかと思っています。
 さて、基本は分かってきたので、次は何を作るかを考えないと……。