我想制作一个简单的 Sinatra 应用程序,当我导航到“/proxy/:someurl”时,我会看到直接导航到 :someurl 的确切内容,也就是一个简单的网络代理,有点像一个完整的页面 iframe。
做这个的最好方式是什么?
我有一个Sinatra网络应用程序.
这样的网址:
http://test.com:9393/signup?username=&email=liubei@test.com&nickname=&gender=&birthday=&password=123456&password_confirmation=123456
如何删除url中的params.Make浏览器中的url是:http://test.com:9393/signup
也可以得到参数
我rvm
事先已经安装好了.我决定从一个包(nginx-full和passenger)安装乘客,并希望使用ruby
安装的rvm
.但不知怎的,它不起作用.这是sinatra
我正在使用的测试应用程序(~yuri/a1/app.rb
):
require 'rubygems'
require 'sinatra'
get '/' do
"Hello and Goodbye"
end
Run Code Online (Sandbox Code Playgroud)
〜尤里/ A1/config.ru:
require 'rubygems'
require 'sinatra'
require './app.rb'
run Sinatra::Application
Run Code Online (Sandbox Code Playgroud)
nginx.conf:
http {
...
passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
# the paths in the above file point out to debian repository's ruby version
server {
server_name a1;
root /home/yuri/a1;
access_log /var/log/nginx/a1-access.log;
error_log /var/log/nginx/a1-error.log;
passenger_enabled on;
passenger_ruby /home/yuri/.rvm/wrappers/ruby-1.9.3-p385@a1/ruby;
}
}
Run Code Online (Sandbox Code Playgroud)
但当我w3m http://a1
access.log
说:
127.0.0.1 - - [12/Sep/2013:21:14:58 +0300] …
Run Code Online (Sandbox Code Playgroud) 当我使用if/else
Sinatra命令的缩写语句时,我收到语法错误:
request.cookies['blog'].nil? ? erb :blog : redirect '/done'
Run Code Online (Sandbox Code Playgroud)
返回此错误:
/home/sinatra/ptt/ptt.rb:107: syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' request.cookies['blog'].nil? ? "erb :blog" : redirect '/done' ^
Run Code Online (Sandbox Code Playgroud)
这两个语句本身都会产生错误(没有Sinatra代码作为另一个语句).
这是一个Sinatra问题还是语法不正确?
当true/false语句是纯Ruby时,不会发生错误:
request.cookies['blog'].nil? ? foo = 1 : bar = 2
Run Code Online (Sandbox Code Playgroud) Sinatra 应用程序。
<%= request.ip %>
Run Code Online (Sandbox Code Playgroud)
如果从本地服务器查看,会给出127.0.0.1 IP 地址。如果从 Heroku 服务器查看,无论来自哪个设备,
都会给出83.245.226.68 IP 地址。
所以我猜它返回服务器的 IP 地址而不是客户端的。那么我如何找出客户端的IP地址呢?我误解了request.ip方法吗?
我正在构建一个通过Web套接字连接到服务器的Web应用程序。服务器组件是基于一个小Ruby应用程序sinatra
,redis
和faye-websocket
。服务器正在Phusion Passenger上运行。一个单独的updater守护进程不断从各种来源获取更新,并将其发布到redis(使用redis
gem和Redis::publish
)。
为了将更新推送给客户端,我在Sinatra应用程序中尝试了以下操作:
get '/' do
if Faye::WebSocket.websocket?(request.env)
store = Redis.new
ws = Faye::WebSocket.new(request.env)
ws.on(:open) do |event|
store.incr('connection_count')
puts 'Client connected (connection count: %s)' % store.get('connection_count')
end
ws.on(:close) do |event|
store.decr('connection_count')
puts 'Client disconnected (connection count: %s)' % store.get('connection_count')
end
ws.rack_response
store.subscribe(:updates) do |on|
on.message do |ch, payload|
puts "Got update"
ws.send(payload) if payload
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
这仅部分起作用。客户端可以成功连接,也可以接收更新,但store.incr
and store.decr
调用不起作用。另外,连接似乎没有正确关闭-当我启动多个客户端时,我注意到连接堆积,乘客服务器最终停止工作。
日志输出:
devserver_1 | App 614 stdout: Got …
Run Code Online (Sandbox Code Playgroud) 我正在关注教程http://learnrubythehardway.org/book/ex50.html,它提供了:
创建尽可能最基本的 Sinatra 应用程序。将以下代码放入
bin/app.rb
:
require 'sinatra'
set :port, 8080
set :static, true
set :public_folder, "static"
set :views, "views"
get '/' do
return 'Hello world'
end
Run Code Online (Sandbox Code Playgroud)
我安装了 gem 和 Sinatra 没有任何问题。我还将教程中的内容复制app.rb
到本地bin/app.rb
文件中。
我运行它:ruby bin/app.rb
终端输出:
/home/t/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in 'require': cannot load such file -- sinatra (LoadError)
from /home/t/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in 'require'
from bin/app.rb:1:in `<main>
Run Code Online (Sandbox Code Playgroud)
当我运行时rake test
它通过了测试。有什么问题?
我有一个简单的sinatra应用程序使用yaml文件来处理数据.其中一个特点是User
可以投票或否决Question
.投票功能很好,但在实施否决功能时我遇到了一些奇怪的事情.
简单地说:
votes_count
为正(>= 1
)时,数字将正确减少votes_count
值为零或负数时,该数字将在data
散列中成功减少,但在转储data
哈希进入yaml文件后,负数变为正数.这是yaml文件Question
:
'1': !ruby/hash:Sinatra::IndifferentHash
title: " Best way to require all files from a directory in ruby?"
description: What's the best way to require all files from a directory in ruby ?
user_id: '3'
votes_count: 0
# other user information
Run Code Online (Sandbox Code Playgroud)
这是与否决权功能相关的路由处理程序:
post "/questions/:id/veto" do
check_vote_validity_for_question(params[:id])
@question = Question.find_by(:id, params[:id])
@question.votes_count = (@question.votes_count.to_i - 1)
Question.update(params[:id], votes_count: @question.votes_count )
# omit …
Run Code Online (Sandbox Code Playgroud)