第23回Rails勉強会@東北に参加しました
https://www.facebook.com/events/388412837883749/
今回の参加者は5人。
やった内容
- Rails3レシピブックのレシピ183を見ながら、OmniAuthでFacebookの認証
- twitter bootstrapを便利に使う twitter bootstrap railsを使ってみた
- FacebookのGraph APIを、Graph APIエクスプローラで実際にAPIのresult見ながらみてみた
- FacebookのDialogs APIを使ったFacebookへのお手軽投稿実験
という感じでした。
今回初参加の方がいらっしゃったのですが、id:xibbarさんがサポートに回って、セットアップをフォローして、とりあえずRailsアプリを作れる所まで、Railsの環境作りをサポートされていました。
その間に他の参加者で上記の内容をやってみた感じです。
OmniAuthでのFacebook認証は各種バージョンアップしたりして、既にRails3レシピブックどおりでは動かなかったので、ハマったところ等を補足しておきます。なお、Railsのバージョンは3.2.6です。
補足ではなく、実際の作業手順はこちらを参考にしてください。
http://d.hatena.ne.jp/CortYuming/20120623/p1
Gemfileで以下のコメントを外しておく
# gem 'therubyracer', :platform => :ruby
Gemfileにomniauthだけでなくomniauth-facebookも記述しておく*1。
gem 'omniauth' gem 'omniauth-facebook'
追加しておかないとuserモデルを作成しようとするときにこんなエラーが出ます。
`rescue in provider': Could not find matching strategy for :facebook. You may need to install an additional gem (such as omniauth-facebook). (LoadError)
Userモデルでユーザーデータを追加するメソッドを記述する所でuser_infoとなっているのですが、infoに修正する必要があります。
Class User < ActiveRecord::Base def self.create_with_omniauth(auth) create! do |user| user.provider = auth["provider"] user.uid = auth["uid"] #user.name = auth["user_info"]["name"] user.name = auth["info"]["name"] #Twitter用なのでなくてもいい #user.screen_name = auth["user_info"]["nickname"] user.screen_name = auth["info"]["nickname"] end end end
SessionsControllerのredirect_toの部分でsintax errorになるので、encodingをきちんと指定してあげるとか日本語の使用をやめる、あるいはちゃんと国際化する必要があります。
# encoding: utf-8 とか class SessionsController < ApplicationController def callback auth = request.env["omniauth.auth"] user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth) session[:user_id] = user.id redirect_to root_url,:notice => "ログインしました" end def destroy session[:user_id] = nil redirect_to root_url,:notice => "ログアウトしました" end end
とりあえずこんな所だったと思います。
あ、あとレシピブックやRailsまわりの問題ではないですが、登録したアプリの設定で、Website with Facebook Loginの所にlocalhost:3000を記入してやらないとcallbackを受け取れないので注意が必要です。
twitter bootstrap railsはこちらを参考にしましたが、さらっと導入するところまでで、cssいじったりまでしてないので、公式で十分だったと思います。
Dialogsは、OmniAuthでFacebookの認証を試してみたサンプルアプリのviewに、link_toを追加するだけのお手軽な感じで試してみました。
<%= link_to("feed dialog","https://www.facebook.com/dialog/feed?app_id=APP_ID&redirect_uri=http://localhost:3000/") %>
今回はこんなかんじで。
参加の皆様お疲れ様でした。