2010-01-25 20 views
8

Prendere il seguente codice:Sinatra variabile Ambito

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

Voglio fare name, e tutte quelle variabili disponibili per l'intero script, così come i punti di vista. Ho provato a renderle variabili globali, ma senza dadi.

risposta

9

Potrebbe non essere il modo "pulito" per farlo, ma impostandole come opzioni dovrebbe funzionare:
->http://www.sinatrarb.com/configuration.html :)

impostazione:

set :foo, 'bar' 

ottenere:

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

Utilizzando 'options' non sarà lanciare un avviso: le opzioni di 'Sinatra :: Base # sono deprecate e saranno rimosse, utilizzare invece #settings." Utilizzare invece 'settings'. – briangonzalez

9

Rendili costanti. Dovrebbero essere comunque non dovrebbero? Non cambieranno.

Creare una costante scrivendolo in maiuscolo.

Leggi questo articolo su Sfere variabili Ruby se hai altri problemi. http://www.techotopia.com/index.php/Ruby_Variable_Scope

Un'altra opzione pulita può essere una classe di configurazione, in cui il metodo init carica lo YAML e quindi imposta le variabili.

Buon divertimento. @miply me quando hai finito il tuo nuovo blog (sto indovinando questo è ciò che questo è per).

5

Dal Sinatra README:


variabili Accesso a modelli

modelli vengono valutate nello stesso contesto come gestori di percorso. Le variabili di istanza fissati nei gestori di percorso sono direcly raggiungibili con i modelli:

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

Oppure, specificare un hash esplicita delle variabili locali:

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

Questo è in genere usata per la resa modelli come parziali all'interno di altri modelli.


Una terza opzione sarebbe quella di impostare gli accessor per loro come metodi di supporto. (Che sono anche disponibili in tutta l'applicazione e la vista.)

1

ciò che funziona anche:

@@foo = "bar" 

Ma non dimenticate di riavviare il server dopo questa modifica

Problemi correlati