2010-01-25 33 views
8

Đi đoạn mã sau:Sinatra Variable Phạm vi

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

Tôi muốn làm name, và tất cả những biến sẵn cho toàn bộ kịch bản, cũng như các quan điểm. Tôi đã cố gắng biến chúng thành các biến toàn cầu, nhưng không có con xúc xắc.

Trả lời

9

Có thể không phải là cách "sạch" để làm điều đó, nhưng thiết lập chúng như các tùy chọn nên làm việc:
->http://www.sinatrarb.com/configuration.html :)

thiết lập:

set :foo, 'bar' 

nhận:

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

Sử dụng 'options' sẽ không hãy cảnh báo: các tùy chọn 'Sinatra :: Base # không được chấp nhận và sẽ bị xóa, sử dụng #settings thay thế.' Sử dụng' settings' để thay thế. – briangonzalez

9

Biến chúng thành hằng số. Họ nên được anyway không nên họ? Họ sẽ không thay đổi.

Tạo một hằng số bằng cách viết nó bằng tất cả các chữ cái.

Đọc bài viết này trên Phạm vi biến thiên của Ruby nếu bạn có thêm bất kỳ vấn đề nào. http://www.techotopia.com/index.php/Ruby_Variable_Scope

Một tùy chọn sạch khác có thể là lớp cấu hình, trong đó phương thức init sẽ tải YAML và sau đó thiết lập các biến.

Vui chơi. @reply me khi bạn đã hoàn thành blog mới của bạn (tôi đoán đây là những gì này là cho).

5

Từ Sinatra README:


Biến Truy cập trong Templates

Templates được đánh giá trong bối cảnh tương tự như xử lý tuyến đường. biến dụ thiết lập trong xử lý tuyến đường là direcly thể truy cập bằng mẫu:

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

Hoặc, chỉ định một Hash rõ ràng của các biến địa phương:

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

này thường được sử dụng khi vẽ mẫu như partials từ bên trong các mẫu khác.


Tùy chọn thứ ba là thiết lập người truy cập cho họ làm phương pháp trợ giúp. (Nào là cũng sẵn trong suốt ứng dụng và quan điểm.)

1

gì cũng làm việc:

@@foo = "bar" 

Nhưng đừng quên để khởi động lại máy chủ sau khi thay đổi này