Facebookアプリを作ってみましたシリーズ2 (Ruby on Rails + koala編)
今回はRubyで作ってみました。
アプリはこちら
このアプリを使うと、自分の年齢や性別などを一切入力する事なく、自分が厄年かどうかを教えてくれます!
http://apps.facebook.com/yakudoshi/
開発について
Ruby1.9
Rails3
Facebookライブラリはkoalaを使ってみました
https://github.com/arsduo/koala/
まだrcバージョンだったり、名前が変な感じだったりして少々不安でしたが、
別の開発で使ったfb_graphと比較してとてもシンプルで、わかりやすくて、結構良い感じでした。
他、説明するのが面倒くさいのでソースそのまま貼っときますので、必要であれば勝手に見てください。
(Ruby勉強中なのでイケてないところとかあったら教えてください)
こまった事
前回のPHPはリダイレクト方式ログインだったので、今回はJavaScriptでのログインを試してみましたが、
IEだとうまくログイン出来ず、こまりました。
詳細は別の記事で書きたいと思います。
ソース
home_controller.rb
# encoding: utf-8 class HomeController < ApplicationController before_filter :parse_facebook_cookies def index #facebookのLinterバグ対応 user_agent = request.env['HTTP_USER_AGENT'] if /^facebookexternalhit/ =~ user_agent render :linter, :layout => false return end #くわしい事はそのうち勉強するが、IE用の対応 response.headers["P3P"] = 'CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"' if @facebook_cookies.nil? render :index else access_token = @facebook_cookies['access_token'] graph = Koala::Facebook::GraphAPI.new(access_token) @profile = graph.get_object("me") #04/01/1989 birthday = Date.strptime(@profile['birthday'], "%m/%d/%Y") #female/male @age = get_age birthday @gender = @profile['gender'] @yaku = "no" if @gender == 'male' if @age == 24 || @age == 41 || @age == 60 @yaku = "zen" elsif @age == 25 || @age == 42 || @age == 61 @yaku = "hon" elsif @age == 26 || @age == 43 || @age == 62 @yaku = "kou" end else if @age == 18 || @age == 32 || @age == 36 @yaku = "zen" elsif @age == 19 || @age == 33 || @age == 37 @yaku = "hon" elsif @age == 20 || @age == 34 || @age == 38 @yaku = "kou" end end render :main end end private def get_age birthday #数え年計算 now = Time.now age = now.year - birthday.year # return age -1 if birthday.month > now.month # return age -1 if birthday.month == now.month && birthday.day > now.day return age + 1 end end
home_helper.rb
# encoding: utf-8 module HomeHelper def yakudoshi_label if @yaku == "no" 'いいえ!' elsif @yaku == 'zen' '前厄!' elsif @yaku == 'hon' '本厄!' elsif @yaku == 'kou' '後厄!' end end end
application.html.erb
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml"> <head> <title>俺厄年?</title> <%= stylesheet_link_tag :all %> <%= javascript_include_tag :defaults %> <%= csrf_meta_tag %> <meta property="og:type" content="website" /> <meta property="og:title" content="俺厄年?" /> <meta property="og:url" content="http://apps.facebook.com/yakudoshi/" /> <meta property="og:image" content="http://kissrobber.com/yakudoshi/images/logo.png" /> <meta property="fb:app_id" content="<%= Facebook::APP_ID %>" /> <meta property="og:description" content="俺厄年?" /> <meta name="author" content="http://iq148.com" /> <link rel="canonical" href="http://apps.facebook.com/yakudoshi/" /> <link rel="shortcut icon" href="http://kissrobber.com/yakudoshi/favicon.ico" /> </head> <body> <%= yield %> <div id="fb-root"></div> <script src="http://connect.facebook.net/ja_JP/all.js"></script> <script> FB.init({ appId : '<%= Facebook::APP_ID %>', status : true, cookie : true, xfbml : true }); <% if @facebook_cookies.nil? %> function login(){ FB.login(function(response) { if (response.session) { location.href="http://kissrobber.com/yakudoshi/"; } else { } }, {perms:'user_birthday'}); } <% else %> function feed(){ FB.ui( { method: 'feed', name: '俺厄年?', link: 'http://apps.facebook.com/yakudoshi/', picture: 'http://kissrobber.com/yakudoshi/images/logo.png', message: '<%= yakudoshi_label %>', description: '<%= @profile['name'] %>さんは厄年?', actions: {'name':'powered by iq148.com', 'link':'http://iq148.com'} }); } <% end %> </script> </body> </html>
main.html.erb
俺厄年?<br/> <a href="javascript:void(0);" onclick="feed();"><img style="position:absolute;top:30px;left:15px;margin:0px;border-style:none;" src="images/<%= @yaku %>.png"/></a> <img style="position:absolute;top:30px;left:580px;margin:0px;" src="images/msg.png"/> <div style="position:absolute;top:30px;left:620px;margin:0px;padding:20px 10px;"> <div style="margin:0px;padding:5px 2px;"> <fb:like layout="button_count" href="http://apps.facebook.com/yakudoshi/"></fb:like> </div> <div style="margin:0px;padding:5px 2px;"> <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://apps.facebook.com/yakudoshi/" data-text="俺厄年? → <%= yakudoshi_label %>" data-count="horizontal" data-via="kissrobber" data-lang="ja">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div> <div style="margin:0px;padding:5px 2px;"> <a href="http://b.hatena.ne.jp/entry/http://apps.facebook.com/yakudoshi/" class="hatena-bookmark-button" data-hatena-bookmark-title="俺厄年?" data-hatena-bookmark-layout="standard" title="このエントリーをはてなブックマークに追加"><img src="http://b.st-hatena.com/images/entry-button/button-only.gif" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="http://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script> </div> </div>