2010-01-25 16 views
8

tomar el código siguiente:Sinatra Mira 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 

Quiero hacer name, y todas esas variables disponibles para todo el guión, así como los puntos de vista. Intenté convertirlos en variables globales, pero no en dados.

Respuesta

9

Puede que no sea el camino "más limpia" para hacerlo, pero ello puede seleccionarlas como opciones debería funcionar:
->http://www.sinatrarb.com/configuration.html :)

ajuste:

set :foo, 'bar' 

conseguir:

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

Uso de 'options' será sin lanzar una advertencia: 'Sinatra :: Base # options está en desuso y se eliminará, use # ajustes en su lugar. ' Use' settings' en su lugar. – briangonzalez

9

Hazlos constantes. Deberían ser de todos modos, ¿no? No van a cambiar.

Haz una constante escribiéndola con mayúsculas.

Lea este artículo en Ruby Variable Scopes si tiene más problemas. http://www.techotopia.com/index.php/Ruby_Variable_Scope

Otra opción de limpieza puede ser una clase config, donde el método init carga el YAML y luego configura las variables.

Diviértete. Repórtame cuando hayas terminado tu nuevo blog (supongo que esto es para lo que esto es).

5

Desde el Sinatra README:


Variables Acceso en plantillas

plantillas se evalúan dentro del mismo contexto que los manipuladores de ruta. las variables de instancia asignadas en los manejadores de ruta son direcly accesible por las plantillas:

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

O, especifique un hash explícita de variables locales:

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

Esto se suele utilizar cuando la prestación de plantillas como parciales desde otras plantillas.


Una tercera opción sería configurar accesos para ellos como métodos de ayuda. (Que son también disponible en toda la aplicación y puntos de vista.)

1

lo que también funciona:

@@foo = "bar" 

Pero no se olvide de reiniciar el servidor después de este cambio