2010-01-25 13 views
8

Weźmy następujący kod:Sinatra Zmienna Zakres

### 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 

Chcę, aby name, a wszystkie te zmienne dostępne dla całego scenariusza, a także widoki. Próbowałem tworzyć zmienne globalne, ale nie kości.

Odpowiedz

9

może nie być "najczystszych" sposób to zrobić, ale ich ustawienie jako opcje powinny działać:
->http://www.sinatrarb.com/configuration.html :)

ustawienie:

set :foo, 'bar' 

się:

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

Użycie 'options' nie będzie wyślij ostrzeżenie: 'Opcje Sinatra :: Base # są przestarzałe i zostaną usunięte, użyj zamiast tego #settings. Zamiast tego użyj' settings'. – briangonzalez

9

Stwórz je. Powinny one być tak czy nie powinny? Oni się nie zmienią.

Stwórz stałą, wpisując ją we wszystkich wersjach.

Przeczytaj ten artykuł na temat zmiennych zakresów zmiennych, jeśli masz więcej problemów. http://www.techotopia.com/index.php/Ruby_Variable_Scope

Kolejną czystą opcją może być klasa konfiguracyjna, w której metoda init ładuje YAML, a następnie ustawia zmienne.

Baw się dobrze. @odaj mi, gdy skończysz swój nowy blog (domyślam się, że to jest właśnie to).

5

Z Sinatra README:


Dostęp do zmiennych w szablonach

Szablony są oceniane w tym samym kontekście co obsługą trasy. Zmienne instancji ustanowionymi w teleskopowe trasy są direcly dostępne szablony:

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

Albo podać jednoznaczną Hash zmiennych lokalnych:

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

To jest zwykle używany podczas renderowania szablonów jak podszablonów od wewnątrz innych szablonów.


Trzecią opcją byłoby ustawienie akcesorów dla nich jako metod pomocniczych. (Które są również dostępne w całej aplikacji i widoki.)

1

co działa również:

@@foo = "bar" 

Ale nie zapomnij, aby ponownie uruchomić serwer po tej zmianie