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>