2010-01-25 6 views
8

Prenez le code suivant:Sinatra Portée variable

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

Je veux faire name, et toutes les variables disponibles à l'ensemble du scénario, ainsi que les points de vue. J'ai essayé d'en faire des variables globales, mais pas de dés.

Répondre

9

ne pourrait être le "plus propre" façon de le faire, mais les définissant comme des options devrait fonctionner:
->http://www.sinatrarb.com/configuration.html :)

Cadre:

set :foo, 'bar' 

obtenir:

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

Utiliser 'options' sera pas lancer un avertissement: 'Sinatra :: Base # options est obsolète et sera supprimé, utilisez #settings à la place. ' Utilisez' settings' à la place. – briangonzalez

9

Rend les constantes. Ils devraient être de toute façon ne devraient-ils pas? Ils ne vont pas changer.

Faites une constante en l'écrivant en majuscules.

Lire cet article sur Ruby Scopes variable si vous avez d'autres questions. http://www.techotopia.com/index.php/Ruby_Variable_Scope

Une autre option propre peut être une classe de configuration, où la méthode init charge le YAML et ensuite configure les variables.

Amusez-vous. @reply moi quand vous avez fini votre nouveau blog (je suppose que c'est ce que c'est pour).

5

De l'Sinatra README:


variables dans les modèles Accès

Les modèles sont évalués dans le même contexte que les gestionnaires d'itinéraire. Les variables d'instance définies dans les gestionnaires d'itinéraire sont direcly accessibles par des modèles:

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

Ou, spécifiez une explicite Hash des variables locales:

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

Ceci est généralement utilisé lors du rendu des modèles comme partials à partir d'autres modèles.


Une troisième option consisterait à configurer des accesseurs pour eux en tant que méthodes auxiliaires. (Qui sont également disponibles dans toute l'application et des vues.)

1

ce qui fonctionne aussi:

@@foo = "bar" 

Mais ne pas oublier de redémarrer le serveur après ce changement