コンテンツ制作者がリンクからデジタルコンテンツを販売できるGumroadがおもしろい

おもしろWebサービスの紹介。
デジタルコンテンツ(やろうと思えばリアルな商品も可能)の作り手が簡単にコンテンツを販売できてしまうWebサービス

制作者はほとんどコンテンツをWebにアップロードするだけ。あとは生成されたリンクを広めれば良い。ユーザーがリンクをクリックするとクレジットカード決済可能なページに遷移。そこで購入したいと思ったらカード番号を入力して決済すれば、コンテンツをダウンロードできる。手数料は5%。

間にGumload以外介在せず、審査もないのでコンテンツ制作者にはある意味革命的なシステムなんじゃないでしょうか。普通なら、技術的にはできるけどセキュリティ面が。。と思いとどまるところをやってしまったところがすごいです。まだまだ問題はあると思いますがこれからの発展性に期待。

https://gumroad.com/

rvm gemsetでgemを切り替える

rvmでRubyの複数のバージョンを共存させることができるが、gemsetでgemの切り替えも可能。
rubyのバージョンを1.9.2に変更

$ rvm use 1.9.2

fooのセットを作る

$ rvm gemset create foo

既存gemsetの確認

$ rvm gemset list
global
foo

gemsetの切り替え

& rvm gemset use foo

異なるバージョンのRailsを簡単に切り替えられて便利!

OmniAuthの設定方法が若干変更されてました

gemがプロバイダ毎に別れた為、個別にGemfileに設定する必要があります。
/Gemfile(twitterFacebookの場合。追記後、$ bundle install 実行)

gem 'omniauth-twitter'
gem 'omniauth-facebook'

/config/initializers/omniauth.rb(今までと同じ)

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, 'TWITTER_KEY', 'TWITTER_SECRET'
  provider :facebook, 'FACEBOOK_ID', 'FACEBOOK_SECRET'
end

SessionsControllerの作成

$ rails g controller sessions

/app/controller/sessions_controller.rb

class SessionsController < ApplicationController
  def create
    user = User.from_omniauth(env["omniauth.auth"])
    session[:user_id] = user.id
    redirect_to root_url, notice: "Signed in!"
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_url, notice: "Signed out!"
  end

  def failure
    redirect_to root_url, alert: "Authentication failed."
  end
end

ルーティングの設定
/config/routes.rb

  root :to => "home#index"
  match "/auth/:provider/callback" => "sessions#create"
  match "/auth/:provider/failure" => "sessions#failure"
  match "/signout" => "sessions#destroy", :as => :signout

Userモデルの作成

$ rails g model user

マイグレーションファイルの修正→migrate

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :provider, :null => false
      t.string :uid, :null => false
      t.string :name, :null => false
      t.string :screen_name, :null => false

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end
$ rake db:migrate

/app/models/user.rb

class User < ActiveRecord::Base
  def self.from_omniauth(auth)
    find_by_provider_and_uid(auth["provider"], auth["uid"]) || create_with_omniauth(auth)
  end

  def self.create_with_omniauth(auth)
    create! do |user|
      user.provider = auth["provider"]
      user.uid = auth["uid"]
      user.name = auth["info"]["name"]
      user.screen_name = auth["info"]["nickname"]
    end
  end
end

テスト用
app/application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery
  
  helper_method :current_user
  private
  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
end

/app/views/home/index.html.erb

<% if current_user %>
  Welcome <%= current_user.name %>! <br />
  <%= link_to "Sign Out", signout_path %>
<% else %>
  <%= link_to "Sign in with Facebook", "/auth/facebook" %><br />
  <%= link_to "Sign in with Twitter", "/auth/twitter" %>
<% end %>

パブリックキーがないとしかられた時の対処

git push heroku master で“Permission denied (public key)”と言われたら下記のコマンドでherokuにパブリックキーを登録し直す。

heroku keys:add <path-to-your-public-key>

【入力例】
heroku keys:add ~/.ssh/id_rsa.pub

エラーメッセージの日本語化

Rails 2.3.5でかなりはまった日本語化だが、Rails3だとずいぶん簡単。一応メモっておく。

config/application.rbに以下の行を追加。

config.i18n.default_locale = :ja

下記のURLからja.ymlをダウンロードしてconfig/locales/以下に置く。
https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml

以上でOK。
モデル追加などでカスタマイズしたい場合は、
以下のようにja.ymlのactiverecordの後に追記すればOK。

attributes:
  topic:
    title: "タイトル"
    description: "内容"
    url: "参考URL"

タイムゾーンの設定

config/environment.rbやconfig/application.rbにタイムゾーンを設定しても、herokuに反映されない。herokuでタイムゾーンを設定するにはコマンドラインから下記のコマンドをたたく必要あり。

$ heroku config:add TZ=Asia/Tokyo

これで無事反映されました。