代码之家  ›  专栏  ›  技术社区  ›  Ethan Turkeltaub

Sinatra可变范围

  •  9
  • Ethan Turkeltaub  · 技术社区  · 14 年前

    以下面的代码为例:

    ### 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 回复  |  直到 14 年前
        1
  •  10
  •   Ian Hunter    6 年前

    可能不是“最干净”的方法,但将它们设置为选项应该可以:
    --&燃气轮机; http://www.sinatrarb.com/configuration.html

    设置:

    set :foo, 'bar'
    

    "foo is set to " + settings.foo
    
        2
  •  10
  •   FluffyJack    14 年前

    使它们成为常量。反正应该是的,不是吗?他们不会改变的。

    在所有的大写字母中写一个常量。

    http://www.techotopia.com/index.php/Ruby_Variable_Scope

    另一个干净的选项可能是config类,其中init方法加载YAML,然后设置变量。

    玩得开心@当你完成你的新博客后回复我(我猜这就是为什么)。

        3
  •  5
  •   SFEley    14 年前

    Sinatra 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
    

    这通常在从其他模板中将模板呈现为部分时使用。


    第三种选择是将它们的访问器设置为助手方法(哪些是 可在整个应用程序和视图中使用。)

        4
  •  1
  •   standup75    12 年前

    同样有效的是:

    @@foo = "bar"
    

    但不要忘记在进行此更改后重新启动服务器