我有一个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?
当一个新的http请求进来时,会启动一个新的sinatra实例,例如是要初始化sinatra,还是只调用sinatra的前一个实例(相应的get/post方法/路由)的方法?感谢您提供任何文档链接,我无法找到任何文档链接.
如果该行为依赖于部署类型(WEBrick/Passenger等)也会很有趣
我有一个使用Rack :: Session :: Cookie的Sinatra应用程序
use Rack::Session::Cookie, :key => 'my.key',
:path => '/',
:expire_after => 3600, # In seconds
:secret => 'something'
Run Code Online (Sandbox Code Playgroud)
在我设置数据的会话中有一个位置,我在会话中转储,在erb调用之前大约600个字节
puts "session is #{session.inspect}" ==> 400 bytes of text
Run Code Online (Sandbox Code Playgroud)
然后我明白了
Warning! Rack::Session::Cookie data size exceeds 4K.
Warning! Rack::Session::Cookie failed to save session. Content dropped.
Run Code Online (Sandbox Code Playgroud)
有趣的是,这一切似乎都在起作用,因为我在会议中设置的所有内容都会在下一次打击时回复给我.Safari开发窗口中报告的会话大小为1195字节,并且看起来都是加密的等等.
关于如何发生这种情况的任何想法?看来这条消息是虚假的,但看着Rack:Session代码 - 似乎有些东西正在被抛弃......
注意:我有另一个关于如何使用Ruby的GZIP数据的类似问题zlib,技术上得到了解答,我不觉得我可以开始改进问题,因为它已被回答,所以尽管这个问题是相关的,但它不一样......
下面的代码(我相信)是GZIP的静态CSS文件并将结果存储在result变量中.但是我在这个意义上怎么做呢:如何将这些数据发送回浏览器,使其被识别为GZIP而不是原始文件大小(例如,当检查我的YSlow分数时,我想要正确地看到它我确保我GZIP静态资源).
z = Zlib::Deflate.new(6, 31)
z.deflate(File.read('public/Assets/Styles/build.css'))
z.flush
@result = z.finish # could also of done: result = z.deflate(file, Zlib::FINISH)
z.close
Run Code Online (Sandbox Code Playgroud)
...有一点需要注意的是,在我之前的问题中,受访者澄清说Zlib::Deflate.deflate不会产生gzip编码的数据.它只会生成zlib编码的数据,所以我需要使用等于31 Zlib::Deflate.new的windowBits参数来启动gzip流.
但是,当我运行此代码时,我实际上并不知道如何处理result变量及其内容.互联网(我可以找到)上没有关于如何将GZIP编码的静态资源(如JavaScript,CSS,HTML等)发送到浏览器的信息,这使得页面加载速度更快.看来我读的每篇Ruby文章都是基于使用Ruby on Rails的人!!
任何帮助真的很感激.
我在寻找一个简单的方法,以使在通过薄独立西纳特拉应用程序运行SSL,而不必通过--ssl,--ssl-key-file并--ssl-cert-file在通过薄命令行参数.
是否可以直接在Sinatra应用程序中或通过config.ru文件定义它们?
我花了几个小时寻找这个问题的答案,但到目前为止还没有找到任何有效的方法.