6

オンラインでダウンロードできるようにしたいファイルがありますが、選択したユーザーのみが利用できます。

これは私が念頭に置いている典型的なシナリオです

ファイルが必要な人は通常、Web サイトにアクセスし、フォームに記入してファイルへのアクセスを要求します。

彼/彼女とファイルを共有したい場合は、電子メールでユーザーに送信される一意のリンクを生成する必要があるユーザーを承認します。リンクは特定の期間のみ有効です。

これにはレールを使用します。私が答えを探しているもの:

  1. ダウンロード用の一意のリンクを生成する正しい方法は何ですか?
  2. 有効期間内にユーザーがリンクをクリックしたときにファイルのダウンロードを開始するにはどうすればよいですか?
4

1 に答える 1

10

まず、トークンを保存するためのモデルを設定する必要があります。

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'

このコードはテストされていませんが、必要なもののほとんどをカバーし、どの方向に進みたいかについてのアイデアを提供する必要があります。

追加の読み物:

于 2012-12-13T20:09:42.480 に答える