Ошибка загрузки при попытке включить пользовательский модуль - PullRequest
1 голос
/ 07 июля 2011

То же приложение, другая проблема. Я работаю над приложением, используя ссылку Дэна Бенджамина "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."

Ответы [ 2 ]

9 голосов
/ 07 июля 2011

Если вы используете Ruby 1.9, по умолчанию $LOAD_PATH больше не включает текущий каталог.Таким образом, хотя операторы типа require 'sinatra' работают просто отлично (поскольку эти гемы находятся в $LOAD_PATH), Ruby не знает, что ваш файл lib/authorization расположен относительно вашего основного файла Sinatra.

Вы можете добавитькаталог файла Sinatra к пути загрузки, и тогда ваши операторы 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'
7 голосов
/ 07 июля 2011

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...