我即将从头开始创建一堆Web应用程序.(请参阅http://50pop.com/code获取概述.)我希望能够从许多不同的客户端访问它们:前端网站,智能手机应用程序,后端网络服务等.所以我真的想要一个每个JSON REST API.
此外,我更喜欢在后端工作,所以我梦想着我完全专注于API,并雇用其他人来制作前端用户界面,无论是网站,iPhone,Android还是其他应用.
请帮我决定采取哪种方法:
一起在铁路上
制作一个非常标准的Rails网络应用程序.在控制器中,执行respond_with开关,以提供JSON或HTML.然后JSON响应是我的API.
亲:很多先例.伟大的标准和许多以这种方式做事的例子.
Con:不一定要API与Web应用程序相同.不喜欢if/then respond_with切换方法.混合两个非常不同的东西(UI + API).
REST SERVER + JAVASCRIPT-HEAVY CLIENT
制作仅限JSON的REST API服务器.使用Backbone或Ember.js直接访问客户端JavaScript,在浏览器中显示模板.
亲:我喜欢API和客户端的分离.聪明的人说这是要走的路.理论上很棒.似乎前沿和令人兴奋.
骗局:没有多少先例.这方面的例子并不多.公共示例(twitter.com)感觉迟钝,甚至转向远离这种方法.
REST服务器+服务器端HTML客户端
制作仅限JSON的REST API服务器.创建一个基本的HTML网站客户端,仅访问REST API.减少客户端JavaScript.
亲:我喜欢API和客户端的分离.但是提供纯HTML5非常简单,而且不是客户密集型的.
骗局:没有多少先例.这方面的例子并不多.框架也不支持这一点.不知道如何处理它.
特别是从经验中寻求建议,而不仅仅是在理论上.
似乎在Sinatra中所有路由处理程序都被写入一个文件中,如果我理解它是一个大/小控制器.有没有办法将它拆分成单独的独立文件,所以当让我们说某人调用"/"时 - 执行一个动作,如果接收到像"/ posts/2"这样的smth,那么另一个动作 - 在PHP中应用的类似逻辑?
我有一个页面网站只使用HTML,CSS和JavaScript.我想将应用程序部署到Heroku,但我找不到办法.我现在正试图让应用程序与Sinatra一起工作.
.
|-- application.css
|-- application.js
|-- index.html
|-- jquery.js
`-- myapp.rb
Run Code Online (Sandbox Code Playgroud)
以下是内容myapp.rb
.
require 'rubygems'
require 'sinatra'
get "/" do
# What should I write here to point to the `index.html`
end
Run Code Online (Sandbox Code Playgroud) 我在用
# my_app.rb
load 'index.rb'
Run Code Online (Sandbox Code Playgroud)
并像这样启动服务器
ruby my_app.rb
Run Code Online (Sandbox Code Playgroud)
但它永远不会重新加载我在索引页面中所做的任何更改.
我在这里错过了吗?
我一直在撞墙,试着弄清楚这里出了什么问题,我肯定(或者更希望)这是一个相当明显的东西,我忽略了.我使用的是Ruby 1.9.1,Sinatra 1.0和RMagick 2.13.1.ImageMagick和RMagick已正确安装并正常运行 - 我已成功操作并保存了来自irb的图像.
params数组的相关部分(为便于阅读而格式化更改):
{"admin_user_new_image_file"=>
{
:filename=>"freddie-on-shetland-pony.png",
:type=>"image/png",
:name=>"admin_user_new_image_file",
:tempfile=>#<File:/var/folders/a7/a7pO5jMcGLCww9XBGRvWfE+++TI/-Tmp-/RackMultipart20100514-20700-o2tkqu-0>,
:head=>"Content-Disposition: form-data; name=\"admin_user_new_image_file\"; filename=\"freddie-on-shetland-pony.png\"\r\nContent-Type: image/png\r\n"
}
}
Run Code Online (Sandbox Code Playgroud)
相关代码:
post "/admin/user/:account_name/image/new/" do
if params[:admin_user_new_image_file][:tempfile]
thumbnail = Magick::Image.read("png:"+params[:admin_user_new_image_file][:tempfile].path).first
end
end
Run Code Online (Sandbox Code Playgroud)
错误(第229行是以"thumbnail ="开头的行:
config.ru:229: [BUG] Segmentation fault
ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-darwin10.3.0]
-- control frame ----------
c:0042 p:---- s:0196 b:0196 l:000195 d:000195 CFUNC :read
c:0041 p:0121 s:0192 b:0192 l:001ab8 d:000191 LAMBDA config.ru:229
c:0040 p:---- s:0189 b:0189 l:000188 d:000188 FINISH
c:0039 p:---- s:0187 b:0187 l:000186 d:000186 CFUNC :call
c:0038 p:0018 …
Run Code Online (Sandbox Code Playgroud) 我已经完成了一些Sinatra和Rails样本,但我很难搞清楚哪些功能属于哪种技术.
使用Sinatra/Rails可以获得什么?它只是ActionPack/ActionView吗?如果我错了,请纠正我,但我可以使用Webrick/Mongrel并提供我的.erb文件吗?我可以在这些文件中使用ActiveRecord技术,仍然可以访问帖子变量,会话状态和查询字符串变量吗?
所以,我问你们的是,如果我从上面的类似PHP的场景开始; Webrick + ERB + ActiveRecord,使用Sinatra可以获得什么?通过使用Rails我还能获得什么?
在服务器端使用带有stream
块的Sinatra .
get '/stream', :provides => 'text/event-stream' do
stream :keep_open do |out|
connections << out
out.callback { connections.delete(out) }
end
end
Run Code Online (Sandbox Code Playgroud)
在客户端:
var es = new EventSource('/stream');
es.onmessage = function(e) { $('#chat').append(e.data + "\n") };
Run Code Online (Sandbox Code Playgroud)
当我直接使用应用程序,通过http://localhost:9292/
,一切都很完美.连接是持久的,所有消息都传递给所有客户端.
但是当它通过Nginx时http://chat.dev
,连接被丢弃并且重新连接每隔一秒左右触发一次.
Nginx设置对我来说没问题:
upstream chat_dev_upstream {
server 127.0.0.1:9292;
}
server {
listen 80;
server_name chat.dev;
location / {
proxy_pass http://chat_dev_upstream;
proxy_buffering off;
proxy_cache off;
proxy_set_header Host $host;
}
}
Run Code Online (Sandbox Code Playgroud)
尝试keepalive 1024
在upstream
部分以及proxy_set_header Connection keep-alive;
在 …
我们将在Sinatra开发一个小API应用程序.有哪些身份验证选项可用于保护API调用?
我有一个自制的Sinatra应用程序,我打算使用Heroku来托管它.
我在开发中使用foreman和shotgun,使用以下Procfile:
web: shotgun config.ru -s thin -o 0.0.0.0 -p $PORT -E $RACK_ENV
Run Code Online (Sandbox Code Playgroud)
它适用于开发和生产.但事实是,我不想在生产中使用霰弹枪,因为它太慢了.
我无法弄清楚如何使用Sinatra记录消息.我不打算记录请求,而是在我的应用程序中的某些点上自定义消息.例如,在获取我想要记录的URL时"Fetching #{url}"
.
这是我想要的:
logger.info("Fetching #{url}")
)我猜这可以很容易地在做config.ru
,但我不是100%肯定,我想启用该设置,如果我必须手动创建一个Logger
对象本人(以及此外,该级Logger
使用方法:Logger
,Rack::Logger
,或Rack::CommonLogger
) .
(我知道在StackOverflow上有类似的问题,但似乎都没有直接回答我的问题.如果你能指出我现有的问题,我会把这个问题标记为副本).