标签: sinatra

基于组件的模块化Sinatra应用程序的体系结构

我正在研究一个包含大约10个不同功能组件的Sinatra应用程序.我们希望能够将这些组件混合并匹配到应用程序的单独实例中,完全由config.yaml文件配置,类似于:

components:

- route: '/chunky'
  component_type: FoodLister
  component_settings: 
    food_type: bacon
    max_items: 400

- route: 'places/paris'
  component_type: Mapper
  component_settings: 
    latitude: 48.85387273165654
    longitude: 2.340087890625  

- route: 'places/losangeles'
  component_type: Mapper
  component_settings:
    latitude: 34.043556504127466
    longitude: -118.23486328125
Run Code Online (Sandbox Code Playgroud)

如您所见,组件可以多次实例化,每个组件都有自己的上下文设置.

每个组件至少包含一个路由,其中​​"route"属性来自用于基础的配置文件.

组织和实例化模块代码的最佳方法是什么?

ruby sinatra

10
推荐指数
1
解决办法
5562
查看次数

ActiveRecord连接警告.(数据库连接不会自动关闭)

我正在尝试用Sinatra和ActiveRecord(3.2.3)创建一个小应用程序.

这是我的主文件的样子:

require "sinatra"
require "sinatra/reloader"
require "active_record"
...

ActiveRecord::Base.establish_connection(
  adapter:  'sqlite3',
  database: 'db.sqlite3',
  host:     'localhost',
)

class Post < ActiveRecord::Base
  ...
end

get('/') { ... }
get('/posts') { ... }
...
Run Code Online (Sandbox Code Playgroud)

它有效,但有时我会在控制台中收到警告:

弃用警告:数据库连接不会自动关闭,请通过调用连接关闭线程末尾的数据库close连接.例如:ActiveRecord :: Base.connection.close'

发生警告时,页面刷新需要很长时间.我不明白我应该在哪里关闭连接.我试图放在 ActiveRecord::Base.connection.close文件的底部,但它没有帮助.

更新:

我忘了提到我还使用来自sinatra-contrib gem的sinatra/reloader插件来查看效果,而无需重新启动服务器.

require "sinatra/reloader"
Run Code Online (Sandbox Code Playgroud)

如果我发表评论,那么问题就会消失.但无论如何,我想知道如何在不禁用重新加载器的情况下解决问题.

ruby activerecord sinatra

10
推荐指数
2
解决办法
6894
查看次数

如何在没有机架文件的情况下将Sprockets与Sinatra一起使用?

我正在编写一个带有通过Thor启动的嵌入式Sinatra应用程序的库.我想挂载Sprockets::Environmentat的实例,/css并将/js主应用程序映射到/.这Rack::URLMapconfig.ru文件中很容易使用,但在这种情况下没有一个因为我以编程方式启动Sinatra应用程序Sinatra::Application.run!.我怎样才能做到这一点?

rack sinatra sprockets

10
推荐指数
2
解决办法
3957
查看次数

如何在Sinatra制作模块化助手

我想在模块中创建一个方法(用于分组原因),可以将其称为a module.method,如下所示:

helpers do
  module UserSession
    def logged_in?
      not session[:email].nil?
    end
    def logout!
      session[:email] = nil
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用UserSession.logged_in?它调用它时表示logged_in不是UserSession的方法

未定义的方法`logged_in?' for UserSession:Module

当我将方法作为UserSession的方法移动时:

helpers do
  module UserSession
    def self.logged_in?
      not session[:email].nil? # error
    end
    def self.logout!
      session[:email] = nil
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误,我无法访问该session变量

未定义的局部变量或UserSession:Module的方法`session'

什么是这个问题的最佳解决方案?

ruby helper sinatra

10
推荐指数
1
解决办法
2634
查看次数

如何在Ruby 1.9.1中将Net :: HTTP响应转换为某种编码?

我有一个Sinatra应用程序(http://analyzethis.espace-technologies.com)执行以下操作

  1. 检索HTML页面(通过net/http)
  2. 从response.body创建Nokogiri文档
  3. 提取一些信息并将其发送回响应中.响应应该是UTF-8编码

所以我在尝试阅读使用windows-1256编码的网站时遇到了这个问题,例如www.filfan.com或www.masrawy.com.

问题是虽然没有抛出错误,但编码转换的结果不正确.

net/http response.body.encoding给出ASCII-8BIT,它不能转换为UTF-8

如果我做Nokogiri :: HTML(response.body)并使用css选择器从页面获取某些内容 - 例如标题标签的内容 - 我得到一个字符串,当我调用string.encoding返回WINDOWS-1256 .我使用string.encode("utf-8")并使用它发送响应,但同样响应不正确.

关于我的方法有什么问题的任何建议或想法?

ruby encoding http sinatra ruby-1.9

9
推荐指数
2
解决办法
9445
查看次数

Sinatra可变范围

请使用以下代码:

### 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 …
Run Code Online (Sandbox Code Playgroud)

ruby scope sinatra

9
推荐指数
3
解决办法
1万
查看次数

Rack :: Session:使用Sinatra,Thin,Rails和Rack :: Cascade的Cookie错误

我有一个组合的Sinatra/Rails应用程序,它使用Rack :: Session :: Cookie共享会话.这个应用程序在使用Rack :: Handler :: Thin.run应用程序启动时工作正常,但是如果rackup文件以瘦启动开始,我在Rack :: Session :: Cookie中出错:


!! Unexpected error while processing request: no marshal_dump is defined for class Proc
no marshal_dump is defined for class Proc
 /usr/local/lib/ruby/gems/1.9.1/gems/rack-1.0.1/lib/rack/session/cookie.rb:64:in `dump'
 /usr/local/lib/ruby/gems/1.9.1/gems/rack-1.0.1/lib/rack/session/cookie.rb:64:in `commit_session'
 /usr/local/lib/ruby/gems/1.9.1/gems/rack-1.0.1/lib/rack/session/cookie.rb:38:in `call'
 /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.5/lib/thin/connection.rb:76:in `block in pre_process'
 /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.5/lib/thin/connection.rb:74:in `catch'
 /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.5/lib/thin/connection.rb:74:in `pre_process'
 /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.5/lib/thin/connection.rb:57:in `process'
 /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.5/lib/thin/connection.rb:42:in `receive_data'
 /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run_machine'
 /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run'
 /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.5/lib/thin/backends/base.rb:57:in `start'
 /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.5/lib/thin/server.rb:156:in `start'
 /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.5/lib/thin/controllers/controller.rb:80:in `start'
 /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.5/lib/thin/runner.rb:177:in `run_command'
 /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.5/lib/thin/runner.rb:143:in `run!'
 /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.5/bin/thin:6:in `'
Run Code Online (Sandbox Code Playgroud)

rackup文件如下所示:


require ::File::dirname(__FILE__) + '/config/environment'
require 'thin'

app = …
Run Code Online (Sandbox Code Playgroud)

rack ruby-on-rails thin sinatra

9
推荐指数
1
解决办法
2379
查看次数

如何用红宝石中的sinatra提供生成的图像

我写了一个简单的Sinatra应用程序,它使用来自某些用户输入的rmagick生成图像.图像以唯一的文件名保存在./public目录中.在Sinatra生成的HTML中使用唯一文件名,以便每个用户获取正确的图像.每天一次脚本删除超过一小时的文件.这显然是一个可怕的黑客,但我没有网络经验!

有没有办法在没有先将它保存到磁盘的情况下在sinatra中提供rmagick图像?

ruby image rmagick sinatra

9
推荐指数
1
解决办法
5191
查看次数

将简单的sinatra应用程序转换为静态html页面的更好方法是什么?

我的一个朋友要求创建一个静态网站,我发现使用Sinatra制作这样的网站是一种纯粹的快乐.我刚写了这样的所有路线:

get '/index.html' do
  haml :index
end

get '/app.css' do
  sass :app
end
....
Run Code Online (Sandbox Code Playgroud)

所以我能够使用布局,haml和sass来快速将网站放在一起.

创建我使用的静态站点

wget -r -l2 http://localhost:4567
Run Code Online (Sandbox Code Playgroud)

哪个确实工作得很好,但我想有一个更好的方法从Sinatra代码创建一个静态网站?

html ruby sinatra

9
推荐指数
1
解决办法
1092
查看次数

Sinatra的限制是什么?

我最近一直在学习Ruby Web框架Sinatra,我发现它很棒.我读过的关于它的大多数文章和博客似乎都认为它仅适用于小型网站或"小型"网络应用程序.这是真的?可以在Sinatra中构建完整的Web应用程序,还是Ruby on Rails?

ruby model-view-controller ruby-on-rails sinatra

9
推荐指数
2
解决办法
1126
查看次数