我正在尝试从本教程中获取一些信息:http://m.onkey.org/2008/11/18/ruby-on-rack-2-rack-builder
基本上我想要一个config.ru告诉机架读取当前目录的文件,这样我就可以像一个简单的apache服务器一样访问所有文件,并且还可以使用index.html文件读取默认的根...有什么方法可以做到这一点?
我目前config.ru看起来像这样:
run Rack::Directory.new('')
#this would read the directory but it doesn't set the root to index.html
map '/' do
file = File.read('index.html')
run Proc.new {|env| [200, {'Content-Type' => 'text/html'}, file] }
end
#using this reads the index.html mapped as the root but ignores the other files in the directory
Run Code Online (Sandbox Code Playgroud)
所以我不知道怎么从这里开始......
我也按照教程示例尝试了这个但是thin没有正确启动.
builder = Rack::Builder.new do
run Rack::Directory.new('')
map '/' do
file = File.read('index.html')
run Proc.new {|env| [200, {'Content-Type' => …Run Code Online (Sandbox Code Playgroud) 我开始玩Sinatra并在Heroku上部署,我发现它非常有趣.我不需要Heroku提供的可扩展性,但我非常喜欢他们的CLI以及通过简单推送部署应用程序的能力.是否有在释放,我会一巴掌说,在一个EC2实例,并且将提供相同的服务(Web服务器,Postgres的,混帐推到部署,维护模式...)VM映像"的一个开源项目小'?
我写了一些Rack-Middleware,现在我正试着用Rspec测试它.但所有Rack-Middleware都使用'app'参数进行实例化,该参数代表Rails应用程序本身.你们怎么在Rspec嘲笑这个?
例如,
describe MyMiddleWare do
let(:app) { # How do I mock a Rails app object here? }
subject { MyMiddleWare.new(app: app) }
it 'should blah blah blah' do
# a bunch of tests go here
end
end
Run Code Online (Sandbox Code Playgroud) 我想MyMiddleware在我的Rack应用程序中运行,但仅适用于某些路径.我希望使用Rack::Builder或至少Rack::URLMap,但我不知道如何.
这是我认为可行的,但不是:
# in my rackup file or Rails environment.rb:
map '/foo' do
use MyMiddleware, { :some => 'options' }
end
Run Code Online (Sandbox Code Playgroud)
或者,更好的是,使用Regexp:
map /^foo/ do
use MyMiddleware, { :some => 'options' }
end
Run Code Online (Sandbox Code Playgroud)
但map似乎最终需要一个应用程序; 它不会仅仅将控制权传回给它的父母.(undefined method 'each' for nil:NilClass当Rack尝试将该do...end块的结尾转换为时,实际错误为" " app.)
是否有一个中间件需要一系列中间件和一个路径,并且只在路径匹配时运行它们?
我发现这篇关于如何作为单独的代理应用使用的博客文章Rack::Proxy.本文解释了他如何使用端口上的应用程序Rack::Proxy代理请求和http://localhost:3000端口上的应用程序3001请求.我想做同样的事情,但我不想创建一个单独的代理应用程序.相反,我希望我的主Rails应用程序将请求代理到另一个应用程序.http://localhost:3000/api3002/blog
博客文章:http://livsey.org/blog/2012/02/23/using-rack-proxy-to-serve-multiple-rails-apps-from-the-same-domain-and-port/
我正在使用Rails 3.2.13的'faye'宝石.在开发中,我在localhost:9292上运行faye,在localhost:3000上运行我的应用程序.我可以通过命令行的curl请求激活弹出窗口,但我无法在我的应用程序中建立连接.我在控制台中收到的错误是:
与'ws:// localhost:9292/faye'的WebSocket连接失败:WebSocket握手期间出错:缺少"升级"标题
我想在我的application.js文件中为faye定义一个标题:
$(function() {
var faye = new Faye.Client("http://localhost:9292/faye");
faye.setHeader("Access-Control-Allow-Origin", "http://localhost:3000");
faye.subscribe('/messages', function (data) {
alert(data);
});
});
Run Code Online (Sandbox Code Playgroud)
这是添加标题的正确方法吗?
我在这里找到了类似问题的讨论:https://github.com/faye/faye/issues/222 在这种情况下,错误似乎与未加载的ssl设置有关.我检查了我的机架gem的lib目录并找到了
def ssl?
scheme == 'https'
end
Run Code Online (Sandbox Code Playgroud)
这似乎很好.如何知道设置是否未正确加载?
关于在哪里寻找下一个的任何线索将非常感激.
上下文:应用程序使用必须在config.ru中设置的Rack中间件,而不是Rails的内部中间件链.这是出于与此问题无关的原因.
问题:如何让我的测试(功能和集成)了解这个中间件?
我会举一个例子来说明问题.让我们创建一个原始的Rails 3应用程序,使用机架重写进行说明.
# /config/initializers/example.rb
Rails.application.middleware.insert 0, 'Rack::Rewrite' do
r301 '/so', 'http://stackoverflow.com'
end
# /test/integration/the_test.rb
require 'test_helper'
class TheTest < ActionDispatch::IntegrationTest
test "redirect from /so to http://stackoverflow.com" do
get '/so'
assert_redirected_to 'http://stackoverflow.com'
end
end
Run Code Online (Sandbox Code Playgroud)
如果您运行上述测试,一切都很好,使用浏览器,您可以确认访问路径/so会将您重定向到StackOverflow.
很酷,让我们现在在Rails之外设置它.删除上述文件/config/initializers/example.rb,并更改config.ru为以下内容:
# /config.ru
require ::File.expand_path('../config/environment', __FILE__)
map '/so' do
run Rack::Rewrite do
r301 '', 'http://stackoverflow.com'
end
end
map '/' do
run Deleteme::Application
end
Run Code Online (Sandbox Code Playgroud)
现在,测试将停止工作.如果您/so使用浏览器访问,该功能确实有效.只是测试不知道Rack设置.
我正在使用Sinatra和CORS接受域A(hefty.burger.com)上的文件上传.域B(fizzbuzz.com)有一个表单,可以将文件上传到A上的路由.
我有一个选项路线和一个后期路线,都命名为'/ uploader'.
options '/uploader' do
headers 'Access-Control-Allow-Origin' => 'http://fizz.buzz.com',
'Access-Control-Allow-Methods' => 'POST'
200
end
post '/uploader' do
...
content_type :json
[{:mary => 'little lamb'}].to_json
end
Run Code Online (Sandbox Code Playgroud)
这些选项首先被击中......然后它会起作用..然后帖子被击中并返回403.
如果我禁用保护,帖子工作......我需要从列表中排除什么样的保护以保持保护但允许这些帖子通过?
我最近才被新的机架防护装置狠狠地踩到了Heroku并让我感到悲伤......任何人都有一个很好的指针,可以在这里做什么?我这么说的原因是,我突然看到日志条目带有会话劫持问题的警报(几乎可以肯定是因为只为应用程序运行> 1 Dyno).我在我的Gemfile.lock中看到了机架保护(1.2.0),即使我从未要求它...我的清单中的某些内容正在调用它,因此它已加载,但我的Sinatra应用程序中的任何内容都没有尝试要求它或者设置它.
最近我碰巧在Ruby代码中看到这个词use,当我正在浏览一些与goliath,middleware等相关的代码时.看起来它与include/ extend,和require.
有人可以解释为什么这个use关键字存在,以及它与include/有require什么不同?它是如何工作的,什么时候使用它?
我已经根据我之前的问题中的答案构建了一个解决方案.Rails 3 for Rails 3中的特定控制器的重定向记录器输出.它工作得很好但是现在我尝试将相同的基于中间件的解决方案应用于Rails 4项目但是那里是一些差异保持相同的解决方案工作.
Rails 3解决方案:
module MyApp
class LoggerMiddleware
REPORTS_API_CONTROLLER_PATH = %r|\A/api/v.*/reports.*|
REPORTS_API_CONTROLLER_LOGFILE = "reports_controller.log"
def initialize(app)
@app = app
@logger = Rails::logger
.instance_variable_get(:@logger)
.instance_variable_get(:@log)
@reports_api_controller_logger = Logger.new(
Rails.root.join('log', REPORTS_API_CONTROLLER_LOGFILE),
10, 1000000)
end
def call(env)
Rails::logger
.instance_variable_get(:@logger)
.instance_variable_set(:@log,
case env['PATH_INFO']
when REPORTS_API_CONTROLLER_PATH then
@reports_api_controller_logger
else
@logger
end
)
@app.call(env)
end
end
end
Rails.application.middleware.insert_before Rails::Rack::Logger, MyApp::LoggerMiddleware
Run Code Online (Sandbox Code Playgroud)
在上面:
Rails.getger = Rails 3 getterRails::logger.instance_variable_get(:@logger).instance_variable_get(:@log)
用于Rails.logger的Rails 3 setter(设置为@my_logger)=Rails::logger.instance_variable_get(:@logger).instance_variable_set(:@log,@my_logger)
我立即注意到的一件事是,在Rails 4中,上面的Rails::logger.instance_variable_get(:@logger).instance_variable_get(:@log)回报为零.
检查Rails 4控制台,我确实看到了Rails.instance_variable_get(:@logger) …