2010-01-25 5 views
8

Возьмем следующий код:Синатра Переменная Scope

### Dependencies 
require 'rubygems' 
require 'sinatra' 
require 'datamapper' 

### Configuration 
config = YAML::load(File.read('config.yml')) 

name = config['config']['name'] 
description = config['config']['description'] 
username = config['config']['username'] 
password = config['config']['password'] 
theme = config['config']['theme'] 

set :public, 'views/themes/#{theme}/static' 

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

class Post 
    include DataMapper::Resource 
    property :id, Serial 
    property :name, String 
    property :body, Text 
    property :created_at, DateTime 
    property :slug, String 
end 

class Page 
    include DataMapper::Resource 
    property :id, Serial 
    property :name, String 
    property :body, Text 
    property :slug, String 
end 

DataMapper.auto_migrate! 

### Controllers 
get '/' do 
    @posts = Post.get(:order => [ :id_desc ]) 
    haml :"themes/#{theme}/index" 
end 

get '/:year/:month/:day/:slug' do 
    year = params[:year] 
    month = params[:month] 
    day = params[:day] 
    slug = params[:slug] 

    haml :"themes/#{theme}/post.haml" 
end 

get '/:slug' do 
    haml :"themes/#{theme}/page.haml" 
end 

get '/admin' do 
    haml :"admin/index.haml" 
end 

Я хочу сделать name, и все те переменные, которые доступны для всего сценария, а также мнения. Я попытался сделать их глобальными переменными, но не кубиками.

ответ

9

не может быть "чистым" способом сделать это, но установка их в качестве опции должны работать:
->http://www.sinatrarb.com/configuration.html :)

установка:

set :foo, 'bar' 

получение:

"foo is set to " + options.foo 
+4

Использование 'options' будет не бросить предупреждение: 'Sinatra :: Base # опции устарели и будут удалены, вместо этого используйте #settings. ' Вместо этого используйте' settings'. – briangonzalez

9

Сделайте их константами. Они все равно должны? Они не изменятся.

Сделайте постоянным, написав его во всех шапках.

Прочтите эту статью по областям переменной Ruby, если у вас возникли проблемы. http://www.techotopia.com/index.php/Ruby_Variable_Scope

Другим чистым вариантом может быть класс конфигурации, в котором метод init загружает YAML, а затем устанавливает переменные.

Удачи. @reply me, когда вы закончили свой новый блог (я предполагаю, что это для чего это нужно).

5

От Sinatra README:


Доступ к переменным в шаблонах

Шаблоны оцениваются в том же контексте, что и обработчики маршрутов. Переменные экземпляра, установленные в обработчики маршрута direcly доступны шаблоны:

get '/:id' do 
    @foo = Foo.find(params[:id]) 
    haml '%h1= @foo.name' 
end 

Или, явно указать хеш локальных переменных:

get '/:id' do 
    foo = Foo.find(params[:id]) 
    haml '%h1= foo.name', :locals => { :foo => foo } 
end 

Это, как правило, используется при визуализации шаблонов как частичными из других шаблонов.


Третьим вариантом было бы установить для них вспомогательные устройства в качестве вспомогательных методов. (Какие также доступны по всему приложению и взглядов.)

1

, что также работает:

@@foo = "bar" 

Но не забудьте перезагрузить сервер после этого изменения

Смежные вопросы