Tag: sinatra

如何在Sinatra / Active Record中限制数据库字符串值的字符/字数?

我的ActiveRecord数据库中有一列我希望有一个字数限制。 基本上,我创建了一个允许用户输入文本(字符串)的表单。 我想限制该字符串中允许的字符数。 @allposts = Post.limit(20) 这是我目前在发布所有内容的/current页面的get方法中所拥有的。 20 =显示的post数量。 我还有一个/new页面,用户将发布新内容。

具有消费者线程和作业队列的Ruby Sinatra

我正在尝试创建一个非常简单的restful服务器。 当它收到请求时,我想在队列上创建一个新作业,当前线程向客户端返回响应时,该作业可由另一个线程处理。 我看着西纳特拉,但还没走得太远。 require ‘sinatra’ require ‘thread’ queue = Queue.new set :port, 9090 get ‘/’ do queue << 'item' length = queue.size puts 'QUEUE LENGTH %d', length 'Message Received' end consumer = Thread.new do 5.times do |i| value = queue.pop(true) rescue nil puts "consumed #{value}" end end consumer.join 在上面的例子中,我知道消费者线程只会运行几次(而不是应用程序的生命周期),但即使这样也不适用于我。 有更好的方法吗?

Sinatra自定义SASS目录

我的haml模板让我的sass工作有问题。 最近我在我的主要sinatra.rb应用程序中有以下代码: require ‘sinatra’ require ‘dm-core’ require ‘dm-migrations’ require ‘haml’ require ‘sass’ require ‘shotgun’ set :views, :sass => ‘views/css’, :haml => ‘template’, :default => ‘views’ helpers do def find_template(views, name, engine, &block) _, folder = views.detect { |k,v| engine == Tilt[k] } folder ||= views[:default] super(folder, name, engine, &block) end end get ‘/css/styles.css’ do sass […]

在Heroku上渲染大量JSON的有效方法

我用一个端点构建了一个简单的API。 它会抓取文件,目前有大约30,000条记录。 理想情况下,我希望能够通过一次http调用获取JSON中的所有记录。 这是我的Sinatra视图代码: require ‘sinatra’ require ‘json’ require ‘mongoid’ Mongoid.identity_map_enabled = false get ‘/’ do content_type :json Book.all end 我尝试过以下方法:使用multi_json require ‘./require.rb’ require ‘sinatra’ require ‘multi_json’ MultiJson.engine = :yajl Mongoid.identity_map_enabled = false get ‘/’ do content_type :json MultiJson.encode(Book.all) end 这种方法的问题是我得到错误R14(超出内存配额)。 当我尝试使用’oj’gem时,我得到了同样的错误。 我只是将一个很长的Redis字符串连接起来,但Heroku的redis服务是每月30美元,我需要的实例大小(> 10mb)。 我目前的解决方案是使用创建对象的后台任务,并在Mongoid对象大小限制(16mb)附近填充它们充满jsonified对象。 这种方法的问题:渲染仍然需要将近30秒,我必须在接收应用程序上运行后处理才能从对象中正确提取json。 有没有人有更好的想法如何在一次通话中为30k记录渲染json而无需切断Heroku?

Ctrl + C不会杀死Sinatra + EM :: WebSocket服务器

我正在构建一个运行EM :: WebSocket服务器和Sinatra服务器的Ruby应用程序。 单独地,我相信这两个都配备了处理SIGINT。 但是,当在同一个应用程序中运行时,当我按Ctrl + C时,应用程序会继续运行。 我的假设是其中一个捕获SIGINT,阻止另一个捕获它。 不过,我不知道如何修复它。 这里的代码简而言之: require ‘thin’ require ‘sinatra/base’ require ’em-websocket’ EventMachine.run do class Web::Server < Sinatra::Base get('/') { erb :index } run!(port: 3000) end EM::WebSocket.start(port: 3001) do |ws| # connect/disconnect handlers end end

我可以测试Sinatra post方法是否成功保存到YAML商店?

我无法在任何地方找到关于如何使用Rack :: Test测试Ruby / Sinatra post方法成功将数据保存到YAML存储/文件的基本解释。 ( 这解释了测试get ,我可以做(!),但没有post ;其他提到测试使用rack / test的post方法似乎无关紧要。)对于自学,我正在构建一个“待办事项”应用程序在Ruby / Sinatra和我正在尝试使用TDD的一切,并像一个好小男孩一样进行unit testing。 我的要求是:当用户发布新任务时,它将保存在YML存储中。 我正在考虑通过查看是否在对用户的响应中显示“任务已保存”来测试这一点(当然这不是直接测试事物本身……但我还想测试它): assert last_response.body.include?(“Task saved”) 或以某种方式测试测试任务的描述现在是否在YML文件中。 我想我可以打开YML文件并查看,然后从YML文件中删除它,但我很确定这不是我应该做的。 我已确认post确实正确保存到YML文件: get(‘/’) do |*user_message| # prepare erb messages @user_message = session[:message] if session[:message] @overlong_description = session[:overlong_description] if session[:overlong_description] session[:message] = nil # clear message after being used session[:overlong_description] = nil # ditto @tasks […]

如何在iframe中显示网站

我正在使用ruby和sinatra。 我需要创建一个网站,允许用户上传其他网站的zipfile,并在页面上的多个iframe中显示所有网站,但我不知道如何开始这个。 到目前为止,我已经建立了可以上传zip文件并将其放在上传文件夹中的网站,我可以通过这样做在网站上显示 Your browser does not support iframes. post ‘/upload’ do File.open(‘uploads/’ + params[‘file’][:filename], ‘w’) do |f| f.write(params[‘file’][:tempfile].read) end end 问题是我不一定知道html文件的名称,或者只是放置它的名称有多少

从Sinatra调用Sinatra会产生与外部请求不同的结果

在这里提出我的问题。 所以我试图使用这个进行智能重定向: get “/category/:id/merge” do #… setting @catalog_id and category call env.merge(“PATH_INFO” => “/catalog/#{@catalog_id}/category/#{category.id}”, “REQUEST_METHOD”=>”PATCH”,”QUERY_STRING”=>”merge=1″) status 200 end 但是当我查看日志时,我看到的东西不仅令人沮丧,而且完全荒谬: # this one is from internal call I, [2013-03-21T15:55:54.382153 #29569] INFO — : Processing GET /catalog/1/category/2686/merge I, [2013-03-21T15:55:54.382239 #29569] INFO — : Parameters: {} … I, [2013-03-21T15:55:54.394992 #29569] INFO — : Processing PATCH /catalog/1/category/2686 I, [2013-03-21T15:55:54.395041 […]

Sinatra不显示POST数据

我正在从客户端向Sinatra发出AJAX请求,但不知何故数据没有显示出来.Chrome请求标题选项卡表明在客户端方面一切正常: Request Payload { test: Data } 然而,在Sinatra方面 post ‘/api/check/:name’ do sleep 3 puts params.inspect end 和控制台: 127.0.0.1 – – [03/Feb/2014 10:45:53] “POST /api/check/name HTTP/1.1” 200 17 3.0019 {“splat”=>[], “captures”=>[“name”], “name”=>”name”} 发布数据无处可寻,有什么不对?

Sinatra Net :: HTTP导致简单请求超时

我有一个简单的Net::HTTP POST请求要对我的Sinatra应用程序执行: def collect(website) uri = URI(“http://localhost:9393/save/#{website}”) res = Net::HTTP.post_form(uri, ‘q’ => ‘ruby’, ‘max’ => ’50’) puts res.body end 但它导致超时。 这是请求处理程序: post ‘/save/:website’ do |website| puts request.body “done” end 我从未达到过puts或done 。 我的shotgun服务器当然在端口9393上运行。 当我使用REST控制台扩展并在其中粘贴有效的json时,它适用于相同的路径。 导致此Timeout :: Error的原因是什么?