2010-01-25 12 views
8

Nehmen Sie den folgenden Code ein:Sinatra Variable 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 

Ich möchte name machen, und all diese Variablen zur Verfügung, die gesamte Skript sowie die Aussicht. Ich habe versucht, sie zu globalen Variablen zu machen, aber keine Würfel.

Antwort

9

vielleicht nicht die "saubersten" Weg, es zu tun, aber sie einstellen, wie Optionen funktionieren sollte:
->http://www.sinatrarb.com/configuration.html :)

Einstellung:

set :foo, 'bar' 

bekommen:

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

Mit 'options' neu zu starten, wird keine Eine Warnung ausgeben: 'Sinatra :: Base # -Optionen sind veraltet und werden entfernt, verwenden Sie stattdessen # settings. Verwenden Sie stattdessen' settings'. – briangonzalez

9

Machen Sie sie zu Konstanten. Sie sollten es trotzdem sein, oder? Sie werden sich nicht ändern.

Machen Sie eine Konstante, indem Sie sie in Großbuchstaben schreiben.

Lesen Sie diesen Artikel zu Ruby Variablenbereichen, wenn Sie weitere Probleme haben. http://www.techotopia.com/index.php/Ruby_Variable_Scope

Eine andere saubere Option kann eine Config-Klasse sein, bei der die init-Methode die YAML lädt und dann die Variablen einrichtet.

Viel Spaß. @melden Sie mich, wenn Sie Ihr neues Blog fertig haben (ich vermute, das ist es, wozu es da ist).

5

Vom Sinatra README:


Zugriff auf Variablen in Templates

Vorlagen werden im selben Kontext wie Route Handler ausgewertet. Instanzvariablen in Route-Handler gesetzt ist direcly zugänglich Vorlagen:

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

Oder eine explizite Hash von lokalen Variablen angeben:

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

Diese Regel wird verwendet, wenn Vorlagen als partials aus anderen Vorlagen zu machen.


Eine dritte Option wäre, Accessoren für sie als Hilfsmethoden einzurichten. (Welche sind auch zur Verfügung in der gesamten Anwendung und Ansichten.)

1

was auch funktioniert:

@@foo = "bar" 

Aber vergessen Sie nicht, den Server nach dieser Änderung

Verwandte Themen