2011-07-07 13 views
1

同じアプリ、別の問題。私はDan Benjamin "Meet Sinatra"のスクリーンキャストを参考にしてアプリを制作しています。私はlibフォルダ(lib/authentication.rb)に格納されているカスタム認証モジュールをインクルードしようとしています。コードの先頭にその行が必要ですが、ページをロードしようとするとロードするファイルがないと主張します。カスタムモジュールを含めるときに読み込みエラーが発生する

どのような考えですか?ここで

は私のメインのシナトラファイルのトップです:

require 'sinatra' 
require 'rubygems' 
require 'datamapper' 
require 'dm-core' 
require 'lib/authorization' 

DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/entries.db") 

class Entry 
include DataMapper::Resource 

property :id,   Serial 
property :first_name, String 
property :last_name, String 
property :email,  String 
property :created_at, DateTime  

end 

# create, upgrade, or migrate tables automatically 
DataMapper.auto_upgrade! 

helpers do 
include Sinatra::Authorization 
end 

そして、実際のモジュール:

module Sinatra 
    module Authorization 

    def auth 
    @auth ||= Rack::Auth::Basic::Request.new(request.env) 
    end 

    def unauthorized!(realm="Short URL Generator") 
    headers 'WWW-Authenticate' => %(Basic realm="#{realm}") 
    throw :halt, [ 401, 'Authorization Required' ] 
    end 

    def bad_request! 
    throw :halt, [ 400, 'Bad Request' ] 
    end 

    def authorized? 
    request.env['REMOTE_USER'] 
    end 

    def authorize(username, password) 
    if (username=='topfunky' && password=='peepcode') then 
     true 
    else 
    false 
    end 
end 

def require_admin 
    return if authorized? 
    unauthorized! unless auth.provided? 
    bad_request! unless auth.basic? 
    unauthorized! unless authorize(*auth.credentials) 
    request.env['REMOTE_USER'] = auth.username 
end 

    def admin? 
    authorized? 
    end 

    end 
end 

その後、私が保護したいハンドラのいずれかで、私は「require_admin」を置きます

+0

正確なコードを投稿してそのファイルを読み込めますか? –

+0

テキストの終わりとコードの開始点の間に空白行を追加して、すべてのコードがコードとしてフォーマットされるようにしました。 – 7stud

答えて

9

Ruby 1.9を使用していると仮定すると、デフォルトの$LOAD_PATHには現在のディレクトリが含まれなくなります。だから、require 'sinatra'のような文はうまく動作しますが(それらの宝石は$LOAD_PATHにあるため)、lib/authorizationファイルがメインのSinatraファイルに関連していることはRubyには分かりません。

あなたはロードパスにシナトラファイルのディレクトリを追加することができ、その後、あなたのrequire文が正常に動作する必要があります:

$LOAD_PATH.unshift(File.dirname(__FILE__)) 
require 'sinatra' 
require 'rubygems' # Not actually needed on Ruby 1.9 
require 'datamapper' 
require 'dm-core' 
require 'lib/authorization' 
+0

それはそれをしました。私は次のチュートリアルは、ruby 1.8で行われたと思います。どうもありがとうございました! – YuKagi

7

Personnaly、私はRubyの1.9.2で動作するので、私は「相対」パスを使用します。

require 'sinatra' 
require 'rubygems' # Not actually needed on Ruby 1.9 
require 'datamapper' 
require 'dm-core' 
require './lib/authorization' 

しかし、私のコードがRuby 1.8.6で再び動作するかどうかは決して確認しません。

+2

私の意見では、これは受け入れられた答えでなければなりません。これまでのところ、私は負荷経路を変更しないでハックを使用していましたが、それは常に私にとって醜いものでした。これは私が探していた解決策です:) –

+0

**しかし両方のオプションが動作します!** –