2011年12月12日月曜日

devise を使う

ちょっと前に Rails + OmniAuth + OAuth on Twitter/Facebook でユーザ認証のサンプルを作ってみたのですが、認証に関する便利な仕組みとして Devise というのを知ったのでそちらを使ってみることにしました。

なお、OmniAuth との連携については wiki ページに情報があります。
最終的には OmniAuth との連携の形に持っていきたいと思います。

まず最初に

https://github.com/plataformatec/devise の Installation の項目にある部分:
  • Devise の gem のインストール
  • Gemfile への追記: gem 'devise'
  • rails g devise:install
  • rails g devise user
  • rails g devise:views
までを行いました。
"rails g devise:install" の後にメッセージが出ます。要約すると:
  1. config.action_mailer.default_url_options を設定せよ
    • config/environments/development.rb だと、"{ :host => 'localhost:3000' }" とか
  2. config/routes.rb にて、root_url を設定(root :to を定義)せよ
    • トップページを表現する適当な controller を用意して、"...#index" とかにしておけば良いはず
  3. app/views/layouts/application.html.erb (つまり global_layout)で notice, alert が表示されるようにせよ
    • こんな感じ。"<p class="notice"><%= notice %></p>"
  4. heroku 上にデプロイする場合には、config/application.rb にて config.asset.initialize_on_precompile = false を宣言せよ
の4点です。
この devise:install 時のメッセージに従って作業すると1/3位の設定が終わります。

もう一つの準備

とりあえず「認証によって保護されるリソース」 を考えないと認証の意味が無いので、todo モデルを作っておきます。
rails g scaffold todo summary:string content:text importance:integer rake db:migrate
この todo を、認証した user だけがアクセスできるようにします。

リソースの保護

リソース todo へのアクセスを認証で制御するには、
  1. app/controllers/todos_controller.rb の修正
    • before_filter :authenticate_user!
  2. routes.rb の修正
    • devise_for :users
とします。
また、ログイン情報入力のための画面を用意した場合、
  • ログインしていないなら、ログイン情報入力画面
  • ログイン済みなら、 ログイン後のトップ画面
のような構成を作りたいと思います。
このような時には devise で提供されている current_user メソッドを使って、
class PortalController < ApplicationController
  def index
    if current_user
      redirect_to :user_root
      return
    end
  end
end
のようなことができます。

2011年12月11日日曜日

rails 環境の準備

何度やっても覚えないので覚えないことにしました。
  1. rvm use 1.9.2@rails3
    • (もちろん 1.9.2 の ruby とか rails3 の gemset は用意しておくべし)
  2. rails new APP_NAME
  3. vi APP_NAME/.rvmrc : 以下の内容で作成
    • rvm use 1.9.2@rails3
  4. cd APP_NAME
  5. vi Gemfile : 以下の内容を追記
    • gem 'therubyracer'
    • gem 'rspec-rails'
  6. bundle install (上記の gem は rails3 gemset に既にインストールされているので必要無し)
  7. rails g rspec:install
  8. rm public/index.html
  9. git init
  10. git add .
  11. git commit
これで、新しい rails アプリを立ち上げて、rspec を使うようにして、git 配下に置く事ができます。

文書にしてみて分かったこと → スクリプトにすれば良いのだ…。

今日も javascript の話

Rubyのことを書くブログだったんですけどね…。

画像の切り替え(同一のエリアに複数の画像をスライドショーのように表示する)を行う javascript を実現しようとして、「そんなの jQuery で一発だろう」と思っていたら、思いのほか基本機能には存在しませんでした。

ということで、「それでも誰かが作っているはずだ」と探したところ、InnerFade with jQuery というのを見つけました。
試してみたら思った通りの挙動をしてくれます。flash のことは嫌いじゃないんですが、やっぱりアクセシビリティということだと厄介な存在だとは思うんで、ちょっとずつ代替手段を見つけていきたいところです。