Sinatra Variable Scope - PullRequest
       11

Sinatra Variable Scope

9 голосов
/ 26 января 2010

Возьмите следующий код:

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

Я хочу сделать name и все эти переменные доступными для всего скрипта, а также для представлений. Я попытался сделать их глобальными переменными, но без кубиков.

Ответы [ 4 ]

10 голосов
/ 26 января 2010

Сделайте их постоянными. Они должны быть в любом случае, не так ли? Они не собираются меняться.

Создайте константу, написав ее заглавными буквами.

Прочтите эту статью по областям применения переменных Ruby, если у вас возникнут какие-либо проблемы. http://www.techotopia.com/index.php/Ruby_Variable_Scope

Другим чистым вариантом может быть класс конфигурации, где метод init загружает YAML, а затем устанавливает переменные.

Веселись. @ ответь мне, когда ты закончишь свой новый блог (наверное, для этого и нужен).

10 голосов
/ 26 января 2010

Возможно, это не самый «чистый» способ сделать это, но установка их в качестве параметров должна работать:
-> http://www.sinatrarb.com/configuration.html:)

установка:

set :foo, 'bar'

получение:

"foo is set to " + settings.foo
5 голосов
/ 11 мая 2010

Из Синатра README :


Доступ к переменным в шаблонах

Шаблоны оцениваются в том же контексте, что и обработчики маршрутов. Переменные экземпляра, установленные в обработчиках маршрута, напрямую доступны по шаблонам:

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

Или укажите явный хэш локальных переменных:

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

Обычно используется при рендеринге шаблонов как частичных из других шаблонов.


Третий вариант - настроить для них методы доступа в качестве вспомогательных методов. (Которые также доступны во всем приложении и представлениях.)

1 голос
/ 02 февраля 2012

что тоже работает:

@@foo = "bar"

Но не забудьте перезапустить сервер после этого изменения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...