我正在研究一个包含大约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"属性来自用于基础的配置文件.
组织和实例化模块代码的最佳方法是什么?
我正在尝试用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)
如果我发表评论,那么问题就会消失.但无论如何,我想知道如何在不禁用重新加载器的情况下解决问题.
我正在编写一个带有通过Thor启动的嵌入式Sinatra应用程序的库.我想挂载Sprockets::Environmentat的实例,/css并将/js主应用程序映射到/.这Rack::URLMap在config.ru文件中很容易使用,但在这种情况下没有一个因为我以编程方式启动Sinatra应用程序Sinatra::Application.run!.我怎样才能做到这一点?
我想在模块中创建一个方法(用于分组原因),可以将其称为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'
什么是这个问题的最佳解决方案?
我有一个Sinatra应用程序(http://analyzethis.espace-technologies.com)执行以下操作
所以我在尝试阅读使用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")并使用它发送响应,但同样响应不正确.
关于我的方法有什么问题的任何建议或想法?
请使用以下代码:
### 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) 我有一个组合的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) 我写了一个简单的Sinatra应用程序,它使用来自某些用户输入的rmagick生成图像.图像以唯一的文件名保存在./public目录中.在Sinatra生成的HTML中使用唯一文件名,以便每个用户获取正确的图像.每天一次脚本删除超过一小时的文件.这显然是一个可怕的黑客,但我没有网络经验!
有没有办法在没有先将它保存到磁盘的情况下在sinatra中提供rmagick图像?
我的一个朋友要求创建一个静态网站,我发现使用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代码创建一个静态网站?
我最近一直在学习Ruby Web框架Sinatra,我发现它很棒.我读过的关于它的大多数文章和博客似乎都认为它仅适用于小型网站或"小型"网络应用程序.这是真的?可以在Sinatra中构建完整的Web应用程序,还是Ruby on Rails?