まず、トークンを保存するためのモデルを設定する必要があります。
rails g model DownloadToken token:string expires_at:timestamp
download_token.rb
class DownloadToken < ActiveRecord::Base
attr_accessible :token, :expires_at
before_create :generate_token
def generate_token
self.token = SecureRandom.base64(15).tr('+/=lIO0', 'abc123')
end
end
次に、送信されたフォームを処理し(または既存のアクションに変更を加え)、トークンを生成し、電子メールを送信するようにコントローラーをセットアップします。
class FooController < ApplicationController
def create
#process submitted form
...
#create a token that expires in 24 hours
@token = DownloadToken.create(:expires_at => Time.now + 24.hours)
#send email and redirect..
end
end
メーラービューに次のようなものが含まれていることを確認する必要があります。
<%= link_to "Click Me", "/files/downloads?token=#{@token.token}" %>
また、ダウンロードの提供を担当するコントローラーをセットアップする必要があります。これは次のようになります。
class FileController < ApplicationController
before_filter :check_token
def check_token
redirect_to :back, :flash => {:error => "Bad link"} if DownloadToken.where("token = ? and expires_at > ?", params[:token], Time.now).nil?
end
def download
send_file '/home/your_app/downloads/yourfile.zip', :type=>"application/zip", :x_sendfile=>true
end
end
ルート.rb(FooがRESTfulリソースとしてすでにセットアップされていると仮定)
match 'files/download' => 'files#download'
このコードはテストされていませんが、必要なもののほとんどをカバーし、どの方向に進みたいかについてのアイデアを提供する必要があります。
追加の読み物: