2013年1月31日木曜日

railsの学習書籍 RailsによるアジャイルWebアプリケーション開発

本日は軽めの内容でrailsを勉強するときの書籍について。 
ワタクシは

RailsによるアジャイルWebアプリケーション開発 第4版

という本で勉強しました。

railsの導入からアプリの土台(scaffold)作成、DBアクセス、コントローラ初期記載にViewのカスタマイズ、はてはAjax通信やメール送信などこれを一通りやったらrails初級者は卒業できるんじゃないかと思っています。
一応目次だけさらすと以下のカンジです。

I 部はじめてのRails 
第1 章Rails のインストール
第2 章Hello, Rails !
第3 章Rails アプリケーションのアーキテクチャ
第4 章Ruby 入門

第II 部アプリケーションを構築する
第5 章Depot アプリケーション
第6 章タスクA:アプリケーションの作成
第7 章タスクB:検証とユニットテスト
第8 章タスクC:カタログの表示
第9 章タスクD:カートの作成
第10 章タスクE:もっとスマートなカート
第11 章タスクF:Ajax の追加
第12 章タスクG:チェックアウト!
第13 章タスクH:メールの送信
第14 章タスクI:ログイン
第15 章タスクJ:国際化
第16 章タスクK:デプロイと本番環境
第17 章Depot のふりかえり

第III 部Rails 詳説
第18 章Rails の構造
第19 章Active Record
第20 章Action Dispatch とAction Controller
第21 章Action View
第22 章キャッシュ
第23 章マイグレーション
第24 章ブラウザを使わないアプリケーション
第25 章Rails の依存コンポーネント
第26 章Rails のプラグイン
第27 章これからどうする

ただやっていて思ったのは、実装練習の流れはサクサク進むんだけど、

  • なんでこれをやってるんだっけ?
  • どうしてこれでいいんだ?

という質問に(完全には)答える内容にはなっていないこと。

これは以下の点に起因すると考えている。

  • rubyという言語自体がもつ『プログラムを容易にするための柔軟性』
  • railsというFWがもつ『開発スピード&楽しさを向上させるための支援性』

堅苦しいこと言ったけどようは『効率的な作業やろうとしたらそのやりかたを熟知しなければいけないし、便利なもの使ったら中の挙動はよくわからん』、ということです。

ただいい本であることは間違いないです。
#やってるうちに基本的なことが理解できるベストプラクティス型だと思ってます。

rails力が以前よりもアップした今の自分なら、前よりは内容を理解してプラクティス(というかrailsの理解)ができる…はず。

2013年1月30日水曜日

Railsのdeviseを使ってみる ~自動生成された標準の画面を調べよう7~

とういわけで前回からの残り部分『deviseを自分ちのアプリで(さしあたり)使うにはどうするか』について書きます。

こういうときはどういう使い方をしたいかをとりあえずあげるのがいいのであげます。
以下のカンジ。

  • ログイン前にルートページにアクセスすると自動的にログインページにいく
  • ログイン前はユーザ登録ができる
  • ユーザ登録完了後は[ログインしたものとする, ログインページに行く]のどちらかがいい
  • ログアウトをするとログインページに行く
これだとすると以下の設定でなんとかなるはず。
  1. ルートページをログイン後の初期画面(ポータルとかトップメニューページ等)とする
  2. ルートページにアクセスした際に未ログインであればログイン画面に飛ばすことにする
  3. ログイン画面にログアウトリンクを配置する
1. に関してはroutes.rbの:root_to で設定すればいいので省略。
2. に関してはJavaで言うところのログインチェックフィルター的なもので実現すればいい。
で調べてみたところ、『コントローラの実行前フィルターに認証フィルターを追加すればよい』、らしい。
日本語で書くとわかりにくいが用は認証チェックを行いたい画面のコントローラに

before_filter :authenticate_user userはモデル名

とすればいいらしい。
#認証フィルターの中身やfilterの機構そのものは今度調べてみたい。


今回は試験的に portalというコントローラ&画面のセットを作成してみた&ウチの認証用のモデルがdevise_userであるので
class PortalController < ApplicationController
  before_filter :authenticate_devise_user!

  #portalの初期表示用アクション
  def index
  end
  
  #普通はコレ以外にもデータ操作などの色々なアクションがある
end
のようにした。

3. についてはググったらすぐ出てきた。
ログアウトリンクを表示する部分で。
<%= link_to 'ログアウト', destroy_devise_user_session_path, method: :delete  %>
とすればいい。(うちはモデル名がdevise_userなので↑のようなヘルパーメソッド名になっている)

なので、今回であればポータル画面に↑のリンクを追加すれば良い。

コレmethod名がdeleteになっているのがポイント。
確かにルーティングを見ると

となっているので、DELETEメソッドじゃないと受付無いようになっている。

ちなみに↑の用にリンクを作っても何故かGETメソッドで飛ばしてしまうという事象にそうぐう*1 した人もいたもよう。
#railsとかdeviseのバージョンが関係しているのかな、とか思った。
#リンク生成ならrailsのバージョンによる影響な気もするが。。。

以上でやりたかったことはできたのでまとめると。

【もともとのねらい】

  • deviseの自動生成された画面及び処理を(そこそこ)理解する
  • (あんまり手をかけず≒自動生成されたものを活かして)自分ちのアプリに組み込む


【具体的にどういう仕様にするか】

  • ログイン前にルートページにアクセスすると自動的にログインページにいく
  • ログイン前はユーザ登録ができる
  • ユーザ登録完了後は[ログインしたものとする, ログインページに行く]のどちらかがいい
  • ログアウトをするとログインページに行く

【上記仕様を実現するために何をすればいいか】

  • ルートページをログイン後の初期画面(ポータルとかトップメニューページ等)とする:configのroutes.rbで root :to => "portal#index" を記載する。(無論publicのindex.htmlは削除する)
  • ルートページにアクセスした際に未ログインであればログイン画面に飛ばすことにする:ログインチェックをかけたい画面のコントローラに before_filter :authenticate_devise_user! を追加する。(devise_userは認証用のモデル名なのでモデル名を変えたらそれに合わせる)
  • ログイン画面にログアウトリンクを配置する:認証後の画面に < %= link_to 'ログアウト', destroy_devise_user_session_path, method: :delete  >  を記載する

ということであったらしい。
というわけで長かったdeviseの話も今回で一段落とします。
次回deviseが登場するのは中級編でしょう。そこでは以下のようなことをやるつもりです。

  • ユーザ登録データ制約のカスタマイズ(パスワード文字数は256文字以上じゃないとダメ!とか)
  • 自動生成された画面をカスタマイズする(見栄えを替えるとか自作するとか)
  • 各アクション後の遷移先ページをカスタマイズする(ログアウト後はログイン画面じゃなくてyahooに飛ばしたいんだ! とか)
  • 他のdeviseの機能について(飛ばしたconfirmとか)

一旦以上。


1:『そうぐう』という単語を見るたびにドラえもんの『未知とのそうぐう機』を思い出してしまう。使うとUFOが飛んできて未知との遭遇が体験できるというとんでもない道具だった。

2013年1月29日火曜日

Railsのdeviseを使ってみる ~自動生成された標準の画面を調べよう6~

前回まででGETで取得できる画面はだいたい取得できたので、今回は以下をやります。

  1. 画面遷移の整理(つながりとか)
  2. 自分ちのアプリでどう使えばいいかの手順の整理
今回が終われば自分ちのアプリに組み込めるからいい区切りになるはず。

1. 画面遷移の整理

今まで得た情報を元にすると以下の流れになっている。
#ちっちゃくてすいません。






ルーティングパスとパス消化状況(↑の図で登場してるか)は下記。
HTTPメソッドカラムの冒頭番号は図の遷移の番号と対応。
HTTPメソッドurlルートパラメータ
①GET/devise_users/sign_in(.:format)devise/sessions#new
②POST/devise_users/sign_in(.:format)devise/sessions#create
DELETE/devise_users/sign_out(.:format)devise/sessions#destroy
⑥POST/devise_users/password(.:format)devise/passwords#create
⑤GET/devise_users/password/new(.:format)devise/passwords#new
⑦GET/devise_users/password/edit(.:format)devise/passwords#edit
⑧POST/devise_users/password(.:format)devise/passwords#update
GET/devise_users/cancel(.:format)devise/registrations#cancel
④POST/devise_users(.:format)devise/registrations#create
③GET/devise_users/sign_up(.:format)devise/registrations#new
⑨GET/devise_users/edit(.:format)devise/registrations#edit
⑩PUT/devise_users(.:format)devise/registrations#update
DELETE/devise_users(.:format)devise/registrations#destroy



残ってるのは

  • /devise_users/sign_out
  • /devise_users/cancel
  • /devise_users (DELETEメソッド発行する奴)
の3つだが、

  • sign_out ⇒ ログアウトでしょ
  • cancel ⇒ よくわからないから一旦パス
  • DELETEメソッド発行する奴 ⇒ ユーザアカウント削除でしょ

と思われるのであとはなんとかなりそう。

というわけで次回自分のアプリへの設定手順を整理してdeviseは一段落とする。
#今回で終わらなかった。。。

2013年1月28日月曜日

Railsのdeviseを使ってみる ~自動生成された標準の画面を調べよう5~

というわけで前回の続きで画面を表示させてみる。
残りは
  • 3. ユーザ登録キャンセル
  • 5. パスワード更新画面表示
の2つ。
#前回は間違えて3より先に4をやってしまっていたらしい。

というわけでログインしている状態で上記2つを表示させてみる。


3. ユーザ登録キャンセル

でやってみたところ、起点画面に遷移して
You are already signed in.
と表示されてしまった。
むむむ。整理すると。
  • ログインしていない状態➡ログイン画面(Sing_in)画面へ飛ばされる
  • ログインしている状態➡『おまえはもうじゅうぶんにろぐいんしている』
と言われる。
この挙動から見るにこの画面は、『ログインしていない状態でアクセスするのが正しい』、ように見える。
#エラーメッセージが出るのがログイン済の状態なので。
悩んでもしょうがないのでコードを読んでみることにする。
/devise_users/cancel のアクションは devise/registrations#cancel であり、そのソースは下記。
#うちはRubyMineで開発しているので Command + N のクラス名を検索したところ、 devise/RegistrationController が発見できたのでそれで見た。
#テキストエディタの人はgemのdeviseのフォルダ以下(あるのかどうかもわからんけど)でも探しにいくことになるのでは無いかと推測。
#例によって日本語コメントはコチラで付記。
  
  # GET /resource/cancel
  # Forces the session data which is usually expired after sign
  # in to be expired now. This is useful if the user wants to
  # cancel oauth signing in/up in the middle of the process,
  # removing all OAuth session data.
  # セッションデータ(普通はSign_in後に破棄される)を直ちに破棄します。
  # これはユーザがOAuthのSign_in,Sign_up の処理を中断するのにベンリです。
  def cancel
    # sessionからdevise… というキーのデータ全部消す
    expire_session_data_after_sign_in!
    #registrasion#new へリダイレクト
    redirect_to new_registration_path(resource_name)
  end

うーん、完全に推測だけど以下のカンジだろうか。
  1. 認証方式をOAuthにする
  2. この状態で認証しようとするとdeviseは入力された情報をsessionに溜め込む
  3. その後OAuth認証を行おうとする
  4. で、途中で辞めたくなった場合に中途半端にsessionにOAuthのデータが残るとセキュリティ的にいまいちなので消す
ともあれとりあえずこの画面を後回しにするべき(なんか深くはまりそう&これより先に普通に使う画面について勉強した方がいい)ということだけはわかった。

5. パスワード更新画面

これも『こんなのログイン後にアクセスしたらパスワード変更画面が出るあれだろ、ハハハ』とか思ってアクセスしたところ。

起点画面に遷移して
You are already signed in.
と表示されてしまった。
あべし。

やむなしと思いなしてpassword#editの中身をのぞいてみると。

  # GET /resource/password/edit?reset_password_token=abcdef
  def edit
    self.resource = resource_class.new
    resource.reset_password_token = params[:reset_password_token]
  end

とほぼノーヒント状態。

#ちなみに後でわかるがこれはノーヒントなどではなく、もうクリティカルな回答そのものが提示されていた。

で、さんざん悩んだあげくgoogl先生に聞いてみたところ
コチラのすばらしいブログhttp://blog.livedoor.jp/nizoraul/archives/3622073.html
が同じようなこと(deviseの解説)をなされていたので、読み進めていくと以下の記載が。

そのあとで、自分のメールのユーザー作って、パスワードを綺麗サッパリ忘れます。 
 そのあとで、「Forgot your password?」からメールアドレスを入力して「send me reset password instructions」をクリックすると... 

おおぅなにやら英文のメールが届きました。そのなかの 
Change my passwordというのがあり、クリックするとパスワード変更ページが開きます。URLを見ると?reset_password_token=****のパラメータが設定されてますねぇ。



あー、わかった、この画面って。

  1. パスワードを忘れた人がパスワードリセット申し込み画面でメールアドレスを入力してリセットを申し込む
  2. 入力したアドレスにリセット画面のリンクが届く
  3. 該当リンクの画面を開いてパスワードリセットを行う
ってやつだ。
となるとそのリンクは  devise_users/password/edit?reset_password_token=zzzz
の的なヤツと推測できる。
#さっきのpassword#editの冒頭に思いっきり GET /resource/password/edit?reset_password_token=abcdef って書いてあるじゃん…、というのがクリティカルな回答でした。

でそのtokenはメールに書いてあるんだろうけど、『そのリンクの正当性を確認するためにはサーバ側にもその値を持っていなければならない』、だろうから多分DBに持ってるはず。
➡ DBのdevise_usersテーブルをのぞいてみるとそのものズバリ reset_password_token というカラムがいる。
で、パスワードリセットを実行したレコードにだけreset_password_token の値がセットされている。

ここまでくればやることはただ一つ。
/devise_users/password/edit?reset_password_token={DBに保存してあるトークン}
にアクセス。
#{}内は置換する。

でたー!



やったー。
苦労したので感慨一入だー。

という訳で今回はココまで。
次回は今までわかったこと、とくに画面遷移を整理して、実際に使う場合のやり方を明らかにしよう。

2013年1月27日日曜日

Railsのdeviseを使ってみる ~自動生成された標準の画面を調べよう4~

というわけで前回の続きで自動生成された画面を見ていく。
今回はログインしていなかったので表示できなかった3画面にリベンジする。

4. ユーザ編集画面表示

ログインしていない状態でリクエストするとログイン画面(Sign in)に飛ばされたやつ。

今度はできるだろと思って、ブラウザで localhost:3000/devise_users/edit にアクセスするとなんとエラー画面(rails のよくあるエラー画面)に。

エラー内容を読むと。

  • Devise/registrations#edit でメソッドありませんエラー発生
  • edit.html.erb の9行目で起きた
  • reconfirmableなんてメソッドないよ
ということらしい。
具体的には
<% if resource.class.reconfirmable && resource.unconfirmed_email.present? %>
というコードで落ちてる。
多分resourceは編集対象(つまりログインしている人のユーザデータ)をさすと思うので、resourceのclass(これはチョットわからん)にreconfirmableなんてメソッドないよ、と言ってるのだと推測。
で、エラーメッセージでググってみると、
『Hi それはconfig/intializers/devise.rbで config.reconfirmable = true になっているからさ!』
『Hi それはテーブルに必要なカラムがないからさ!』
的なのがあったのでdevise.rbを見直してみると、config.reconfirmable = false になっていた。
ウーン、なんでだろうと思ってテーブルを作成したmigrationを見直してみると
## Confirmable
# t.string   :confirmation_token
# t.datetime :confirmed_at
# t.datetime :confirmation_sent_at
# t.string   :unconfirmed_email # Only if using reconfirmable

とこっちは封印がされている。
で、とりあえずこいつらをテーブルに追加してみる。

空マイグレーション作成
rails g migration AddConfirmableToDeviseUsers

で中身を以下の感じに。
class AddConfirmableToDeviseUsers < ActiveRecord::Migration
  def change
    add_column :devise_users, :confirmation_token, :string
    add_column :devise_users, :confirmed_at, :datetime
    add_column :devise_users, :confirmation_sent_at, :datetime
    add_column :devise_users, :unconfirmed_email, :string
  end
end

でやってみた(ユーザ新規登録➡ユーザ編集)のだがさっきと同じエラーになった。
で、さらにググってみると
『Hi confirmableを使うならconfig.reconfirmable=trueにしてviewを生成するのさ!』
的なメッセージがあったので、
『これひょっとして、config.reconfirmable=trueの状態でview生成して、その後にfalseに設定したんじゃね?』
と思い直して、以下を実施。

  • 一旦deviseのviewを削除
  • config.reconfirmable=false に設定(していることを確認)
  • rails generate devise:viewを実施

で、できたedit.html.erbを見てみると
<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
と生成結果が変わっている。
これは期待できる。
➡というわけでやってみた(ユーザ新規登録➡ユーザ編集)


できた。
#左端の青はスクリーンショットとるときに映り込んだうちのmacの背景

ソースは以下のカンジ。

Edit Devise user



(leave blank if you don't want to change it)

(we need your current password to confirm your changes)

Cancel my account

Unhappy?
. Back

というわけで本日は以下のノウハウと以下の課題が。

  • deviseでconfimationを使わない場合は設定ファイルで『設定しない』をやってからviewを作ること
  • そもそもconfirmation機能とはなにかを明らかにすること

長くなったので本日はここまで。
次回は画面表示の続き。

2013年1月26日土曜日

Railsのdeviseを使ってみる ~自動生成された標準の画面を調べよう3~

前回は生成されたview, model, migrationの中身をチラ見した。
今回は実際にリクエストを打って画面を表示させてみよう。

この前のルーティング情報に基づくといきなり表示できそうなのは以下。
#ちなみにHTTPメソッドは全部GET
  • ログイン画面表示 /devise_users/sign_in
  • ユーザ登録画面表示 /devise_users/sign_up
  • ユーザ登録キャンセル /devise_users/cancel
  • ユーザ編集画面表示 /devise_users/edit
  • パスワード更新画面表示 /devise_users/password/edit
  • パスワード??? /devise_users/password/new

順番に画面を表示させてみよう。

1. ログイン画面
ブラウザで localhost:3000/devise_users/sign_in にアクセスすると以下の感じに。















で、表示されているソースを見ると以下のようになっていた。
#例によって日本語コメントはコチラで追記。

Sign in



Sign up Forgot your password?

サマリーすると。

  • ログイン用フォーム
  • ユーザ新規登録へのリンク
  • パスワード忘れた人用のリンク
の3つがこの画面のコンテンツということになる。

2. ユーザ登録(Sing_up)画面

ブラウザで localhost:3000/devise_users/sign_up にアクセスする or ログイン画面のSing upリンクをクリックすると以下の画面が出てくる。
















で、表示されているソースを見ると以下のカンジ。
#例によって日本語コメントはコチラで追記。

Sign up





Sign in Forgot your password?


で、見てみると /devise_users/password/new はパスワード忘れた人用リンクのURLとなっている。

つまり 
  • パスワード??? /devise_users/password/new
の正体は

  • パスワードを忘れた人へ /devise_users/password/new
と思われる。
3. ユーザ登録キャンセル

これはいきなり表示できない気がするけど、とりあえずやってみる。
ブラウザで localhost:3000/devise_users/cancel にアクセスするとさっきのユーザ登録画面(SignUp)が表示された。
まあ、うまく行かないとは思ってた。
一旦後回し。

4. ユーザ編集画面表示


これもログインしていない状態じゃ表示できない気がするけど、とりあえずやってみる。
ブラウザで localhost:3000/devise_users/edit にアクセスすると今度はログイン画面(SignUp)が表示された。
ユーザのデータ修正するならまずログインしなさい、ということでしょう。
一旦後回し。

5. パスワード更新画面表示

これも4.同じ結果なので省略。


6. パスワード???

ブラウザで localhost:3000/devise_users/new 以下のカンジになった。













うむ、ヤハリ正体はパスワードを忘れた人用画面だった。
ソースは以下のカンジ。

Forgot your password?


Sign in Sign up


といったあたりで今回はココまで。
次回はユーザを作ってみて今回表示できなかった画面を表示する予定。

2013年1月25日金曜日

Railsのdeviseを使ってみる ~自動生成された標準の画面を調べよう2~

前回の続きでviewとモデルについてみていくことにします。
#ただviewは枚数が多いので一旦どんなものがあるかぐらいで、止めます。

1. できたview
まずviewはこれだけあった。

結構あるようだ。
認識していたのは
  • sessions
  • registrations
  • passwords
の3つ。
それ以外は多分以下。
#予測の説明付記。
  • confirmations:何らかの確認を行うための画面。『このデータでユーザ登録しますか?』『パスワードを初期化していいですか?』的な。
  • mailer:メールを送信する画面。パスワードリセットとかだろうか?
  • shared:コレはちょっと分からん。
  • unlocks:コレはロックされたアカウントの解放だと思われる。

2. できたモデル
#日本語コメントはコッチで付記。

class DeviseUser < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  # (このクラスは)デフォルトのデバイスモジュールを含んでいます。
  # コレ以外にも
  # :token_authenticable トークン認証可否
  # :confirmable 確認可否
  # :lockable アカウントロック可否
  # :timeoutable タイムアウト制御可否
  # :omniauthable OmniAuth可否
  # があります。

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  # このモデルでのアクセサ(Javaでいうとgetter,setter)を定義します
  attr_accessible :email, :password, :password_confirmation, :remember_me
  # attr_accessible :title, :body
  # title, body属性へのアクセサはコメントアウトしています。
end

deviseメソッド(devise :database_authenticable, … の部分)がこのモデルのポイントになると思うので今度のぞいてみよう。

3. できたマイグレーション

最後にテーブル作成マイグレーション(コレ長い)
#コチラも日本語コメントはコチラで付記。

class DeviseCreateDeviseUsers < ActiveRecord::Migration
  def change
    create_table(:devise_users) do |t|
      ## Database authenticatable
      # データベース認証用カラム(メールアドレス, 暗号化パスワード)
      t.string :email,              :null => false, :default => ""
      t.string :encrypted_password, :null => false, :default => ""

      ## Recoverable
      # アカウント復旧用カラム(パスワードリセット用トークン, リセットパスワード送信先
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      # 思い出し用(よくわからん)カラム
      t.datetime :remember_created_at

      ## Trackable
      # アカウント履歴用カラム(ログイン回数, 現行ログイン時刻, 最終ログイン時刻, 現行ログインIP, 最終ログインIP)
      t.integer  :sign_in_count, :default => 0
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip

      ## Confirmable
      # 確認用カラム(デフォルト封印)
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # ロック用カラム(デフォルト封印)
      # t.integer  :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at

      ## Token authenticatable
      # トークン認証用カラム(デフォルト封印)
      # t.string :authentication_token

      t.timestamps
    end
    
    # インデックス作成
    add_index :devise_users, :email,                :unique => true
    add_index :devise_users, :reset_password_token, :unique => true
    # add_index :devise_users, :confirmation_token,   :unique => true
    # add_index :devise_users, :unlock_token,         :unique => true
    # add_index :devise_users, :authentication_token, :unique => true
  end
end

といったところで今回はここまで。

次回はリクエストでも打って表示された画面を見てみたい。

2013年1月24日木曜日

Railsのdeviseを使ってみる ~自動生成された標準の画面を調べよう~

この間の続きでdeviseを使ってみようというはなし。

前提は以下。

  • deviseのインストールは終了
  • rails generate devise:install を実行し設定ファイルはできてる
  • rails generate devise:view を実行し標準のビューはできてる
  • rails generate devise devise_user を実行しdevise用のモデルはできてる
それを踏まえて色々(ルーティングとか画面表示とか中身とか)調べてみたい。
とは言っても闇雲に調べても効率が悪いので以下の感じで行ってみる。
#全然関係ないですが、『やみくも』 と 『くらやみのくも』 って似てますね。


STEP1 中身を調べる

  • ルーティングを調べる(まずはリクエスト可能なURLを一覧を知ろう)
  • モデルの中身を調べる(ざっくりどんなフィールドがあるかぐらいを知ろう)
  • コントローラの中を調べる(ちょろっと見て感覚をつかもう)
  • 各URLをリクエストしてみる(とりあえず打ってみよう)
  • どんな画面が表示されるか見てみる(とりあえず見てみよう)
  • セッションデータには何が入っているか見てみる(セッション管理は認証のキモなので)

STEP2 STEP1を踏まえて自分ちのアプリでの組み込み方を調べたり考えたりする
  • 自分ちのアプリにどう組み込めばいいか(画面遷移とかログアウトリンクの配置とか)
  • 画面のカスタマイズはどうするか(多分URLとパラメータ名変えれば好きな様にできるんだろうけど)
  • モデルのカスタマイズはどうするか(これもそれほど悩まないはず)
  • コントローラのカスタマイズはどうするか(というかどうやるか)


というわけでまずはルーティングについて調べてみる。


rakse routes を実行してdevise 関連の部分を抜いたのがコレ。
#ヘルパーメソッド名は紙面の都合(横幅)上表示をあきらめた。


HTTPメソッドurlルートパラメータ
GET/devise_users/sign_in(.:format)devise/sessions#new
POST/devise_users/sign_in(.:format)devise/sessions#create
DELETE/devise_users/sign_out(.:format)devise/sessions#destroy
POST/devise_users/password(.:format)devise/passwords#create
GET/devise_users/password/new(.:format)devise/passwords#new
GET/devise_users/password/edit(.:format)devise/passwords#edit
PUT/devise_users/password(.:format)devise/passwords#update
GET/devise_users/cancel(.:format)devise/registrations#cancel
POST/devise_users(.:format)devise/registrations#create
GET/devise_users/sign_up(.:format)devise/registrations#new
GET/devise_users/edit(.:format)devise/registrations#edit
PUT/devise_users(.:format)devise/registrations#update
DELETE/devise_users(.:format)devise/registrations#destroy



なんかそれっぽい予想で整理・和訳すると。

【ログイン処理(sessions コントローラ)】
ログイン画面表示 /devise_users/sign_in
ログイン処理 /devise_users/sign_in
ログアウト /devise_users/sign_out

だと思う。
初め見た時は、
『なんだ、ログイン画面表示とログイン処理のURLが一緒じゃないか』、と思ったらHTTPメソッドがPOSTとGETと異なっていて、呼び出されるアクションもnew と create で違っていたので、
『ああ、GETでログイン画面表示してPOSTでログインね』
と納得できた。
Rails(というか多分Rest)的によくあるやつだと思う。

次にregistrationsの方。
#passwordはどういう画面か分からなかったので理解しやすそうな方から行きます。
【ユーザ登録・編集(registrationsコントローラ】
ユーザ登録画面表示 /devise_users/sign_up
ユーザ登録 /devise_users
ユーザ登録キャンセル /devise_users/cancel
ユーザ編集画面表示 /devise_users/edit
ユーザ登録 /devise_users

今度は /devise_users が3つも登場しているがコントローラのアクションで見ると以下の動きが予測(たぶん)できる。
  • ユーザ登録 registrations#create ⇒ HTTPのPOSTメソッドで飛んできたらこっちのアクションを発動させて新規登録する
  • ユーザ編集画面表示 devise/registrations#update ⇒ HTTPのPUTメソッドで飛んできたらのアクションを発動させて編集する
  • ユーザ登録 devise/registrations#destroy ⇒ HTTPのDELETEメソッドで飛んできたらコッチを発動させる

あってるかはどうかは画面を表示させたりすればたぶんわかるでしょう。

で、最後にパスワードだけどこれがよくわからん。
【パスワード処理(passwordsコントローラ)】
パスワード更新画面表示 /devise_users/password/edit
パスワード??? /devise_users/password/new
パスワード登録??? /devise_users/password
パスワード更新 /devise_users/password

更新画面表示と更新は分かる。
なにがわからないかというと以下二点。
  • ユーザ登録時にパスワード登録してるはずだから新規とかおかしいんじゃね?
  • パスワードはユーザのモデルに含まれるんだから新規とかパスワードの新規とか変じゃね?

この辺をソースを読んだり画面を見たりして理解していくことにしよう。

長くなったので今回は以上になります。

2013年1月23日水曜日

アラビアータとインペリアルチョコレートスタウト2012

サンクトガーレンのインペリアルチョコレートスタウト2012をアラビアータとともにいただきました、というはなし。

まずサンクトガーレンについてはここ
http://www.sanktgallenbrewery.com/
を参照してください。
ざっくり言うと厚木のクラフトビール醸造所です。(たぶん)

#ワタクシも去年知りました。
#バラエティに飛んでるけど飲みやすいビールが多いので、初心者にもオススメ。

でコレの頒布会に申し込んでるのでビールが届いているのです。

で、せっかくなのでアラビアータを作って飲みながら食べました。





















チョコレートスタウトは2012に作成したものを一年間寝かせたものらしい。

香りとコクがアップしてるような気がする。

あと、アラビアータはもうちょっとにんにくの香りがしてもいいのになかなかうまくいかない。
今度コツを調べよう。

2013年1月22日火曜日

BloggerにSyntaxHighligterを入れる

もうたくさんの人が書いてるネタだけど書いておきます。
今回コチラで実施した内容をサマリーすると。


①ジェネレータでJavaScriptとCSSを作成する
②作成した①のコードをBloggerのテンプレートに取り込む
③コードで表示したい部分を<pre>タグで囲む

という感じ。

①について
コードのハイライトは多分以下の2点で実現してる。
・コードの部分がきれいに見えるようなCSSを作る
・JavaScriptで↑のCSSがいい感じに当たるように処理をする
で、ジェネレータでは選択された言語に応じて↑の二つを上手く実行するようなJavaScriptとCSSを作ってるんだとおもう。
ジェネレートされたコードを見てみると。












のようになっており(雰囲気的には)上から順番に。

  • SyntaxHighligterのコアCSSを読み込む
  • eclipseの見栄えになるようのCSSを読み込む
  • 各言語に応じたJavaSctipを読み込む
  • SyntaxHighligterの処理を実行する

となっているもよう。
#CSSとかJavaScriptの中身とかは今度のぞいてみたい。

②について
Bloggerのテンプレート設定があるのでそこからやります。

















JavaScriptの関数宣言や外部ソース取得、CSSの外部ソース取得はHTMLの<header>部で行うので、Bloggerのテンプレートに①で取得したものを埋め込むことで、自分ちのブログで有効にすることができる。
うちだとこうした。




















③について
とりあえずコードっぽいものを書いてみて<pre class="brush: html;">タグで囲んでみるといいかもしれない。
それ以降の色々できることはおいおいためしていきましょう。

一旦ここまで。

2013年1月21日月曜日

ビールの基礎知識を買いました

ビールの基礎知識 という本を買ったという話です。

大半がビールの紹介(まあ、それも楽しいんだけど)なので、もっと理論とか歴史とか小ネタとかそういうのがよかった。

上面発酵がエールで下面発酵がラガー(wikiより http://ja.wikipedia.org/wiki/ビール)ということくらいはおぼえておこう。
#じゃあはじめから本じゃなくてwikiでも読んでればいいじゃん、というのはおいておいて。

今年はクラフトビールエンジニア(クラフトビールを飲むのが大好きなシステムエンジニア)を目指してがんばります。

2013年1月20日日曜日

RubyMineでrails destroy model をやりたい場合

RubyMineでdestroyモデルとかどうやるんだろ、とずっと気になってたのだがRailsスクリプトコンソールを使えばよかったらしい。

具体的には(ただしMac環境)
ウィンドウメニュー➡Tool➡Run Rails Script…
で出てくるウィンドウで








とすればよかったらしい。

実行ログは

remove    db/migrate/20121211050519_create_aaa.rb
remove    app/models/aaa.rb
invoke    test_unit
remove      test/unit/aaa_test.rb
remove      test/fixtures/aaas.yml

とかなってるので、『テーブル消えてないんじゃない?』 って思ってDBコンソールでアクセスしてみたらやっぱり消えてなかった。
なのでdropマイグレーションつくって消すことにした。

2013年1月19日土曜日

railsでDeviseを入れる

Railsで認証機構をするいい感じのGemとしてDeviseがいるらしいのでそれを入れてみる。

今日やったこと
  • gemのインストール
  • devise機能のインストールと設定
  • ビュー作成
  • モデル作成

1. gemのインストール
RubyMineを使ってるのでQuickInstallで2.2.1をGemをインストールして、Gemifileに
gem 'devise'
って書いてbundle install した。
で後で2.2.2の方が最新なことに気づいたので入れ直しをした。
入れ直しする際のコンボは下記らしいので覚えておこう。
# {} 部分は置換
bundle uninstall {Gem名}
bundle install {Gem名} {Version番号}
bundle update

2. devise機能のインストールと設定
コマンドは
rails generate devise:install
そのログ(途中から)と必要に応じての翻訳は以下の感じ.

      create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
===============================================================================

Some setup you must do manually if you haven't yet:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:
     environmentファイルのdefault url オプションを確認しましょう。
     開発環境用の設定(config/encironments/development.rb)のサンプルは 
     config.action_mailer.default_url_options = { :host => 'localhost:3000' }
     とかになります。
     
     In production, :host should be set to the actual host of your application.
     本番環境では:hostには実際の値(実際のメールサーバ?)を指定しましょう。

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     root_url を設定していることを確認しましょう。
     For example:

       root :to => "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:
     application.html.erbでflashメッセージを設定していることを確認しましょう。
     ➡これ、デフォルトのapplicationテンプレート使ってない場合はそっちにかくんだろう。

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

  4. If you are deploying Rails 3.1+ on Heroku, you may want to set:
     Rails3.1以上でherokuにデプロイする場合は以下の設定をする必要があります。

       config.assets.initialize_on_precompile = false

     On config/application.rb forcing your application to not access the DB
     or load models when precompiling your assets.
     これでassets以下のプリコンパイル時にDBアクセスloadモデルしなくなります。

  5. You can copy Devise views (for customization) to your app by running:
     Deviseのviewを使う場合は

       rails g devise:views
     をやりましょう。

って書いてあったので、だいたい言われた通りにホイホイ書いておいた。

3. ビュー作成
多分deviseの標準の画面とかをつくってくれるのでしょう、と予測しつつ。
rail generate devise:view
を実行する。
ログは下記。
invoke  Devise::Generators::SharedViewsGenerator
      create    app/views/devise/shared
      create    app/views/devise/shared/_links.erb
      invoke  form_for
      create    app/views/devise/confirmations
      create    app/views/devise/confirmations/new.html.erb
      create    app/views/devise/passwords
      create    app/views/devise/passwords/edit.html.erb
      create    app/views/devise/passwords/new.html.erb
      create    app/views/devise/registrations
      create    app/views/devise/registrations/edit.html.erb
      create    app/views/devise/registrations/new.html.erb
      create    app/views/devise/sessions
      create    app/views/devise/sessions/new.html.erb
      create    app/views/devise/unlocks
      create    app/views/devise/unlocks/new.html.erb
      invoke  erb
      create    app/views/devise/mailer
      create    app/views/devise/mailer/confirmation_instructions.html.erb
      create    app/views/devise/mailer/reset_password_instructions.html.erb
      create    app/views/devise/mailer/unlock_instructions.html.erb

後で中身をのぞいてみよう。

4. モデル作成
deviseにマッチしたモデルを作成する。
ただし現状のuserモデルもいるのでまずは名前を変えて作ってみる。
というわけで
rails generate devise devise_user
を実行。(devise_user はモデル名)

      invoke  active_record
      create    db/migrate/20130119034259_devise_create_devise_users.rb
      create    app/models/devise_user.rb
      invoke    test_unit
      create      test/unit/devise_user_test.rb
      create      test/fixtures/devise_users.yml
      insert    app/models/devise_user.rb
       route  devise_for :devise_users

今日はココまで。