我正在使用Rack Session Pool,但是我的用户会被一个网络服务器线程踢到另一个网络服务器线程上,使会话数据到期.我开始在Sinatra中启用:会话,但是我无法使用它,因为我有使用Sinatra的多个应用程序(它似乎正在使用相同的密钥 - 不确定这是因为它是否是相同的主机)
因此,由于我的应用程序会互相破坏,我现在正在尝试使用Rack Session Cookie并设置变量(与启用相同:会话,但您可以设置变量)
伟大,所以工作!但是现在我无法以我使用它的方式访问会话数据,在Rack Session Pool和enable:sessions中
session[:user] = nick
puts session[:user]
Run Code Online (Sandbox Code Playgroud)
你明白了......
问题是为什么我可以在Pool和Sinatra中使用session [:user]启用会话来访问会话数据:会话,但不能在Rack Session Cookie中访问会话数据?我错过了什么吗?我所做的就是下面
config.ru
use Rack::Session::Cookie, :key => 'key',
:domain => "localhost",
:path => '/',
:expire_after => 14400, # In seconds
:secret => 'secret'
Run Code Online (Sandbox Code Playgroud)
编辑:
做了一些测试并发现它实际上把它放在会话变量中,但是一旦它移动到新方法或重定向会话变量似乎被删除(这个cookie真的大于4KB?!) - 它可以'因为启用:会话工作得很好
我是Ruby的新手,想知道为什么我在这种情况下使用简单的Sinatra应用程序中的'mail'gem获得错误:
post "/email/send" do
@recipient = params[:email]
Mail.deliver do
to @recipient # throws error as this is undefined
from 'server@domain.com'
subject 'testing sendmail'
body 'testing sendmail'
end
erb :email_sent
end
Run Code Online (Sandbox Code Playgroud)
然而,这工作正常:
post "/email/send" do
Mail.deliver do
to 'me@domain.com'
from 'server@domain.com'
subject 'testing sendmail'
body 'testing sendmail'
end
erb :email_sent
end
Run Code Online (Sandbox Code Playgroud)
我怀疑这与块范围和我对它的误解有关.
rake --tasks需要大约18秒才能运行.这只是加载所有任务所需的时间,因此我定义的任何任务至少需要花费这么多时间才能运行:
$time rake --tasks
rake db:clean # Cleaning up database
rake passenger:restart # Restart Application
rake spec # Run specs
real 0m18.816s
user 0m7.306s
sys 0m5.665s
Run Code Online (Sandbox Code Playgroud)
我的Rakefile:
$: << "."
require "rubygems"
require "rspec/core/rake_task"
desc "Run those specs"
task :spec do
RSpec::Core::RakeTask.new(:spec) do |t|
t.rspec_opts = %w{--colour --format progress}
t.pattern = 'spec/*_spec.rb'
end
end
task :default => :spec
Run Code Online (Sandbox Code Playgroud)
知道为什么耙子花了很多次?谢谢
我已经尝试了两种形式的Dockerfile来运行一个简单的Ruby/Sinatra应用程序,并且在这两种情况下它都会因为不同的原因而失败(我稍后会解释).
实际上我想从我的主机(使用Boot2Docker的Mac OS X)访问Sinatra Web服务器.
应用程序结构是:
.
??? Dockerfile
??? Gemfile
??? app.rb
??? config.ru
Run Code Online (Sandbox Code Playgroud)
文件的内容是:
Dockerfile
第1版......
FROM ruby
RUN mkdir -p /app
WORKDIR /app
COPY Gemfile /app/
RUN bundle install --quiet
COPY . /app
EXPOSE 5000
ENTRYPOINT ["bash"]
CMD ["bundle", "exec", "rackup", "-p", "5000"]
Run Code Online (Sandbox Code Playgroud)
第2版......
FROM ubuntu:latest
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN apt-get -qqy install libreadline-dev libssl-dev zlib1g-dev build-essential bison openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 …Run Code Online (Sandbox Code Playgroud) 在一个类似的Rails应用程序中,我能够创建一个递归的哈希检查函数,然后运行Sanitize gem的clean/fragment方法从传入的params哈希中删除任何HTML元素.我在application_controller中使用了一个前置过滤器,所以一切都在应用程序范围内被清除(这是一个很棒的应用程序).
背景故事:XSS攻击是可能的,特别是在IE浏览器中,但实际上我们不希望任何这些东西被保存到数据库中.虽然最终目标是JSON输出不包含它.
我试图在Sinatra应用程序(它有一些ActiveSupport和JRuby ActiveRecord捆绑在一起)中做同样的事情,但是Sanitize gem不会捆绑,因为这个特定的应用程序在JRuby中运行由于某些数据库原因.Sanitize需要Nokogiri,而Nokogiri又需要Nokogumbo,后者不会在这个JRuby环境中构建.
因此我尝试使用Rack :: Util内置的html转义方法在app.rb中进行前置过滤,但这会炸毁应用程序.
有没有其他方法可以考虑
1)将所有传入的参数消毒到(JRuby)Sinatra应用程序中
如果没有,一个较小的选择:
2)使所有被解析的JSON清理所述JSON属性值列表中的值?
PS - 这里的部分问题是,一个包含的本地gem,它处理了许多params并进行JSON渲染,证明无法调试.我将在主机应用程序和本地链接的宝石中包含Pry,当我尝试撬入宝石时,我无法查看params散列(它只显示为空) - 似乎是一个问题范围.
在调用我的路由时,我遇到了丢失实例和nilClass错误的问题.在源代码中钻研之后,似乎generate_method调用基本上使用初始方法的块创建了一个新方法.
get "/" do
@some_local_instance.do_something()
end
Run Code Online (Sandbox Code Playgroud)
所以在上面的方法中,很可能在该类中有一个名为some_local_instance的局部变量,但是当实际评估死记硬背时,它没有关于方法定义位置的上下文,因此它将失败.
我问的原因是因为作为我脚本的一部分,我有外部类,当加载Sinatra时会加载哪些注册路由,当调用这些路由时,我需要访问这些类的一些局部变量.一个例子是:
class SomeRouteClass
def initialize(sinatra, calculator)
@calculator = calculator
@sinatra = sinatra
end
def setup_routes
@sinatra.get "/add" do
return @calculator.add(1,1)
end
end
end
class Calculator
def add(a,b)
return a+b;
end
end
sinatra = Sinatra.new
calculator = Calculator.new
routing_class = SomeRouteClass.new(sinatra, calculator)
routing_class.setup_routes
sinatra.run!
Run Code Online (Sandbox Code Playgroud)
原谅任何拼写/语法错误这只是一个简单的例子,但正如你可以看到一个类注册路由以及当该路由被命中时返回一个由实例化它的计算器实例生成的值.
我遇到的问题是,在这个例子中,当我尝试运行/ add路由时,它告诉我@calculator是一个nilClass,我相信它可以归结为Sinatra只是在没有上下文的情况下获取代码块的方式.对于任何简单的模板渲染来说这似乎都很好,但是如果你需要做更多花哨的事情,或者想通过不使用静态和单例来保持你的代码模块化,你似乎没有任何办法解决这个问题......
我的假设在这里是否正确?如果是这样的话,有任何方法可以保持上下文,因为如果我必须将所有东西都写成静态和单例以便从路径进行交互,那么它就会迫使我编写糟糕且难以维护的代码.
==编辑==
重新构建了问题和内容,以更准确地反映实际问题,现在我对库有了更深刻的理解.
目标:使用Sinatra + DataMapper + Postgres + Heroku部署一个简单的测试应用程序
问题:当使用gem'dm-postgres-adapter'gem'dm-sqlite-adapter'将应用程序推送到Heroku时,我得到了这个.使用本机扩展安装do_sqlite3(0.10.7)不幸的是,发生了致命错误.请通过https://github.com/carlhuda/bundler/issues向Bundler问题跟踪器报告此错误,以便我们对其进行修复.谢谢!
我访问了那个github链接,有人遇到了同样的问题,但是被定向到Heroku,https://github.com/carlhuda/bundler/issues/1488.我已经发送电子邮件到Heroku的邮件列表,我正在等待回复.
我遇到了LoadError: no such file to load -- dm-sqlite-adapter
所以我把它添加到Gemfile和Gemfile.lock中,这是我所能得到的
我试图在本地安装和设置Postgres,但那是我正在慢慢学习但却无法开始工作的新的痛苦.
我也在这里用一个类似的问题阅读了每一个问题,有些人向我推进了这一点,有些人没有得到提问者的回答而留下一个谜.
-----------------
source :rubygems
gem 'sinatra', '1.1.0'
gem 'thin', '1.2.7'
gem 'data_mapper'
gem 'dm-postgres-adapter'
gem 'dm-sqlite-adapter'
Run Code Online (Sandbox Code Playgroud)
------------------------
...
dm-sqlite-adapter (1.2.0)
dm-do-adapter (~> 1.2.0)
do_sqlite3 (~> 0.10.6)
...
Run Code Online (Sandbox Code Playgroud)
--------------------
web: bundle exec ruby recall.rb -p $PORT
Run Code Online (Sandbox Code Playgroud)
---------------------
require 'rubygems'
require 'sinatra'
require 'data_mapper'
DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/recall.db")
class Note
include DataMapper::Resource …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的运行在Ruby 1.9.3上的Sinatra应用程序,它使用ERB和markdown模板.我已经剥离它以证明问题.
这是在Mac OS X Snow Leopard上运行Sinatra 1.3.2.对于降价我使用的是rdiscount 1.6.8.
主要的Ruby文件包含
get '/services' do
erb :services
end
Run Code Online (Sandbox Code Playgroud)
services.erb文件中包含以下内容
<%= markdown :'content/service1' %>
£
Run Code Online (Sandbox Code Playgroud)
在markdown文件中我只有一行
£
Run Code Online (Sandbox Code Playgroud)
当我运行Sinatra应用程序并加载'services'页面时,我Encoding::CompatibilityError at /services incompatible character encodings: UTF-8 and ASCII-8BIT在ERB文件的第二行(仅包含'£'的那一行)上获得了异常.
我做了很多谷歌搜索,我不能为我的生活弄清楚为什么会这样.ERB和markdown文件在我的本地磁盘上是UTF-8,但显然它们被Sinatra加载并变成字符串,我不知道如何判断这些字符串的编码.
如果我强迫Sinatra使用ASCII-8BIT(通过添加settings.default_encoding = 'ASCII-8BIT'到我的主要Sinatra Ruby文件的顶部),则不会抛出任何异常但是'£'字符出现错误.
有什么指针吗?
我刚刚将一个Sinatra应用程序部署到heroku,该应用程序包含两个rake任务:
task :create_db , [:db_id , :db_name]
task :destroy_db , [:db_id, :token]
Run Code Online (Sandbox Code Playgroud)
我跑的时候
heroku run rake -T
Run Code Online (Sandbox Code Playgroud)
在控制台中,Heroku打印以下响应:
(in /app)
rake create_db[db_id,db_name] # Creation count database task
rake destroy_db[db_id,token] # Destroy database task
Run Code Online (Sandbox Code Playgroud)
但是,当我跑:
heroku run rake create_db['test', 'test database']
Run Code Online (Sandbox Code Playgroud)
它响应以下错误:
(in /app)
rake aborted!
Don't know how to build task 'create_db[test,'
/usr/local/lib/ruby/1.9.1/rake.rb:1720:in `[]'
/usr/local/lib/ruby/1.9.1/rake.rb:2040:in `invoke_task'
/usr/local/lib/ruby/1.9.1/rake.rb:2019:in `block (2 levels) in top_level'
/usr/local/lib/ruby/1.9.1/rake.rb:2019:in `each'
/usr/local/lib/ruby/1.9.1/rake.rb:2019:in `block in top_level'
/usr/local/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling'
/usr/local/lib/ruby/1.9.1/rake.rb:2013:in `top_level'
/usr/local/lib/ruby/1.9.1/rake.rb:1992:in `run'
/usr/local/bin/rake:31:in `<main>'
Run Code Online (Sandbox Code Playgroud)
我不太清楚为什么会失败,但我的猜测是它与字符串参数有关.正如您在上面所看到的,它表示"不知道如何构建任务'create_db [test,'测试显示没有字符串.
知道如何从命令行运行此任务吗?
我在sinatra项目中使用ActiveSupport,并遵循一些同行的建议,我一直在使用ActiveSupport :: Dependencies.autoload_paths来简化我在开发中加载我的类.现在我正在接近部署日,我并不知道如何急切地加载它们.在Rails中,这很简单:只需设置config.cache_classes = true并按照自己的方式行事即可.但在Sinatra应用程序中,我没有看到如何急切加载它们.