我认为这是一个非常简单的问题,但我似乎无法做到这一点.基本上,我正在尝试使用Rack中间件将默认的Cache-Control标头设置为我的Sinatra应用程序提供的所有响应.它看起来像机架:: responseHeaders响应应该能够做的正是我需要的,但我得到尝试使用证明的语法时出现错误在这里我rackup文件:
use Rack::ResponseHeaders do |headers|
headers['X-Foo'] = 'bar'
headers.delete('X-Baz')
end
Run Code Online (Sandbox Code Playgroud)
我能够让Rack :: Cache成功运行如下:
use Rack::Cache,
:default_ttl => 3600
Run Code Online (Sandbox Code Playgroud)
但是,这并没有达到我想要的输出,而Rack :: ResponseHeaders提供了对标题的细粒度控制.
仅供参考,我的网站托管在Heroku上,所需的Rack gems在我的.gems清单中指定.
谢谢!
更新:经过一些研究,看起来第一个问题是在安装的rack-contrib(0.9.2)版本中找不到Rack :: ResponseHeaders.我将从调查开始.
我正在尝试安装Bundler,这样我就可以将我的Sinatra应用程序部署到具有所有正确宝石的服务器上.
我已经创建了我的Gemfile
source :gemcutter
gem 'sinatra', '1.0'
gem "nokogiri", "1.4.2"
gem "rack", "1.1.0"
gem "dm-core", "1.0.0"
gem "dm-migrations", "1.0.0"
gem "dm-sqlite-adapter", "1.0.0"
gem "pony", "1.0"
Run Code Online (Sandbox Code Playgroud)
接下来我创建了一个Config.ru
require 'rubygems'
require 'bundler'
Bundler.setup
require 'sinatra'
require 'dm-core'
require 'dm-migrations'
require 'dm-sqlite-adapter'
require 'open-uri'
require 'nokogiri'
require 'csv'
require 'pony'
require 'parsedate'
require 'digest/md5'
require 'MyApp'
run MyApp
Run Code Online (Sandbox Code Playgroud)
到目前为止一直很好,所以接下来我跑了bundle install并且得到了'Bundle Complete'所以现在我需要做的只是Rackup
然后我得到:
config.ru:18: undefined local variable or method `MyApp' for #<Rack::Builder:0x1227350 @ins=[]> (NameError)
from /usr/local/lib/ruby/gems/1.8/gems/rack-1.1.0/lib/rack/builder.rb:46:in `instance_eval'
from /usr/local/lib/ruby/gems/1.8/gems/rack-1.1.0/lib/rack/builder.rb:46:in `initialize'
from …Run Code Online (Sandbox Code Playgroud) 所以我用sinatra写了一个简单的"Hello World"网站:
#!/usr/bin/env ruby
# sinatra_demo/bin/sinatra_demo
require 'rubygems'
require 'sinatra'
get "/hello" do
"Hello World!"
end
Run Code Online (Sandbox Code Playgroud)
当我运行它,它可以工作,我可以将我的浏览器发送到http:// localhost:4567/hello并获得"Hello World":
% sinatra_demo/bin/sinatra_demo
== Sinatra/1.2.6 has taken the stage on 4567 for development with backup from WEBrick
[2011-06-30 09:29:58] INFO WEBrick 1.3.1
[2011-06-30 09:29:58] INFO ruby 1.9.2 (2011-02-18) [x86_64-darwin10.7.4]
[2011-06-30 09:29:58] INFO WEBrick::HTTPServer#start: pid=73620 port=4567
127.0.0.1 - - [30/Jun/2011 09:30:10] "GET /hello HTTP/1.1" 200 12 0.0027
localhost - - [30/Jun/2011:09:30:10 EDT] "GET /hello HTTP/1.1" 200 12
- -> /hello
127.0.0.1 …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种更简单的方法来创建一个小型个人网站,而不是使用Ruby on Rails(我会说我有'中级'经验).该网站将主要是从块(文章,菜单等)构建的静态页面,我希望能够使用像Markdown这样的东西来创作,以便非技术人员可以撰写文章.该网站还需要一些简单的反馈型表格.我可能不需要大量的测试.
该网站的外观非常简洁,我希望完全控制外观.我对Rails,Ruby,Javascript,HTML和CSS感到满意.
我想知道的是,我是否会通过使用Rails进行维护(包括部署)和为网站创作内容的复杂程度.我听过一些关于Sinatra的事情,引起了我的兴趣,但从未使用它 - 这会减少维护费用吗?
如果站点要求用户登录,建议是否会更改?
post '/upload' do
unless params[:file] && (tmpfile = params[:file][:tempfile]) && (name = params[:file][:filename])
return haml(:upload)
end
time = Time.now.to_s
time.gsub!(/\s/, '')
name = time + name
while blk = tmpfile.read(65536)
File.open(File.join(Dir.pwd,"public/uploads", name), "wb") { |f| f.write(tmpfile.read) }
end
'success'
end
Run Code Online (Sandbox Code Playgroud)
一切都在预期文件最终被破坏的地方.
关于在Heroku上部署Sinatra应用程序,我感到很困惑的事实上并不是一个实际问题 - 只是一个概念上的难题.
我有两个应用程序,几乎在每个方面都相同,只是一个将大部分逻辑放在一个不包含Sinatra :: Base类的文件中,并使用'require otherfilename'来获取它需要的逻辑.Sinatra:Base类名为Kincalc.
对于包含一个文件中所有逻辑的应用程序(即包含Sinatra:Base类的同一文件),在我的config.ru文件中,最后一行显示"运行Sinatra :: Application",它启动正常.但在另一个应用程序中,如果我将其作为最后一行包含,则应用程序正确上传并说它"已部署到Heroku"但它会显示"未找到"消息.当我有最后一行读'run Kincalc'时,它加载正常.
我已经来回检查了这两个应用程序是如何构建的,除了一个人使用第二个文件作为逻辑(也是在root用户)的事实.为什么这是一个问题,还是这真的是问题?当我尝试将第二个文件(没有Sinatra类的文件)放在一个单独的lib文件夹中时,它在我调用类名时仍然有效,但在我调用"Sinatra :: Application"时却不行.
我的Sinatra应用程序中有一个简单的身份验证系统.session[:user_id]当用户输入正确的登录名和密码时,它基本上设置为用户的id.这已经足够了,我不会使用其他解决方案.
我需要做的是做出"记住我"的选择.那么我怎样才能为我的简单解决方案做到这一点?我无法弄清楚.
我正在尝试使用jQuery向我的Sinatra应用程序提交表单,但是当通过AJAX进行POST时,Sinatra应用程序正在显示一个空白页面.我希望它保持在同一页面,并更新我在javascript中指定的内容.这是我的代码,剥离了:
post '/register' do
register( params )
end
get '/register' do
haml :register
end
Run Code Online (Sandbox Code Playgroud)
这是我在haml文件中的javascript:
:javascript
$(function() {
$("button#submit").click(function(){
$.ajax({
type: "POST",
url: "/register",
data: $('form.register').serialize(),
success: function(){
$("#message").html("Successfully registered")
},
error: function(){
$("#message").html("Not Successful")
}
});
});
});
Run Code Online (Sandbox Code Playgroud) 我是Ruby和RSpec的新手.我来自Java背景,这就是为什么我的测试真的看起来像junit代码.我想更多地了解RSpec的,但我不太明白subject,let,!let.所以,如果有人可以指导我清理这些代码,我将非常感激.
我有Sinatra,RSpec正在用Twitter登录.
get '/login/twitter' do
begin
request_token = TwitterService.new.authentication_request_token
session[:request_token_twitter] = request_token
redirect request_token.authorize_url
rescue Exception => e
logger.error(e.message)
redirect '/'
end
end
get '/login/twitter/success' do
request_token = session[:request_token_twitter]
twitter_service = TwitterService.new
access_token = twitter_service.authorize(request_token, params[:oauth_verifier])
begin
twitter_user_info = twitter_service.verify_credentials
twitter_id = twitter_user_info["id"]
response.set_cookie("auth_token", :value => twitter_id, :path => '/')
response.set_cookie(@social_flag, :value => "t", :path => '/')
expected_user = @user_manager.find_by_id(twitter_id.to_s)
if expected_user.is_null?
twitter_user = User.new(twitter_id, access_token.token, access_token.secret, "t")
twitter_user.save
logger.info("Saving ...")
logger.info("Twitter ID #{twitter_id}") …Run Code Online (Sandbox Code Playgroud) 如何获取某个目录中每个文件的相对路径?如果我使用Dir["path/to/folder/*"]它输出整个路径.