标签: sinatra

如何使用haml与heroku?

我尝试让haml在没有sinatra的宝石的情况下工作(Heroku不允许宝石安装,据我所知)

到目前为止我做了什么:

  • 在我的项目中克隆haml git repo

  • add:要求'haml/lib/haml.rb'到我的sinatra主文件

以下作品:

get '/test' do
  Haml::Engine.new('%p test').render
end
Run Code Online (Sandbox Code Playgroud)

但以下不是:

get '/test2' do
  haml :my_template
end
Run Code Online (Sandbox Code Playgroud)

我收到错误:

NoMethodError - 未定义的方法each' for nil:NilClass (haml):20:in渲染'

./haml/lib/haml/engine.rb:152:在`render'中

./haml/lib/haml/engine.rb:152:在`instance_eval'

./haml/lib/haml/engine.rb:152:在'渲染'中......

还有其他要求的文件吗?有任何想法吗 ?

ruby gem haml heroku sinatra

5
推荐指数
1
解决办法
3487
查看次数

CTRL + C不会停止sinatra应用程序

通常,当我在开发期间从控制台运行rails应用程序时,我可以按Ctrl+ C然后退出.然后我可以再次运行应用程序,从而弹出它并实现更改.

我正在运行一个sinatra应用程序.我只是运行ruby文件.

$: ruby myapp.rb
Run Code Online (Sandbox Code Playgroud)

但是,当我按Ctrl+ C时,它不会停止应用程序.我不得不调出Ubuntu系统监视器并终止Ruby进程.很烦人.

有谁见过这个/之前处理过这个?

ruby console sinatra

5
推荐指数
1
解决办法
1053
查看次数

设置与DataMapper和Sinatra的关联

好吧,这让我发疯了.我已经阅读了协会的文章和例子,并试图在拉斯三天内解决这个问题,我厌倦了这让我感到愚蠢,所以......

如何设置与DataMapper的关联?

(我正在使用带有SQLite3的带有Sinatra的DM.对于具有多个值等的单个表,一切都很好.当我开始尝试将它们关联起来时,我开始收到错误.)

假设我有一个装满苹果树的果园.每棵树都有很多苹果.每个Apple都有很多种子.因此每棵树通过其苹果有很多种子

require 'sinatra'
require 'datamapper'

DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/orchard.db")

# Trees in the orchard.
class Tree
  include DataMapper::Resource
  property :id, Serial

  has n, :apples
  has n, :seeds, :through => :apples
end

# Apples on a Tree.
class Apple
  include DataMapper::Resource
  property :id, Serial

  belongs_to :tree
  belongs_to :seed
end

# Seeds in an Apple
class Seed
  include DataMapper::Resource
  property :id, Serial

  has n, :apple
  has n, :tree, :through => apple 
end

DataMapper.finalize.auto_upgrade!
Run Code Online (Sandbox Code Playgroud)

那是对的吗?我尝试运行时遇到各种错误.大多数沿着无效关联的行或者不能创建值为NULL的列NULL等.我不理解这种关系?

此外,一旦我有了工作模型,我该如何从中获取信息?

如果有3棵树:

Tree.all.count 
=> 3
Run Code Online (Sandbox Code Playgroud)

如果有2个苹果:

Apple.all …
Run Code Online (Sandbox Code Playgroud)

ruby datamapper sinatra

5
推荐指数
1
解决办法
3466
查看次数

Sinatra路线的必需和可选参数

使用Sinatra路由,如何在路径的同一部分中同时存在所需的命名参数和可选的命名参数.

可选路由参数在这里工作正常

get '/widgets.?:format?'
Run Code Online (Sandbox Code Playgroud)

但是,尝试组合一个必需的命名参数,事情就会破裂.

get '/widgets/:id.?:format?'
Run Code Online (Sandbox Code Playgroud)

对/widgets/abc.json的请求将整个abc.json作为id参数传递.

Sinatra编译的正则表达式是:

/^\/widgets\/([^\/?#]+)(?:\.|%2E)?([^\/?#]+)?$/
Run Code Online (Sandbox Code Playgroud)

ruby regex routing routes sinatra

5
推荐指数
1
解决办法
3028
查看次数

Sinatra将变量传递给erb

我有两种方法可以做到这一点.

首先是使用:locals => {....}和其他是使用@var_name.我只是想知道哪一个更好/更喜欢?我无法在任何地方找到答案.

谢谢

ruby sinatra

5
推荐指数
1
解决办法
6127
查看次数

如何在Ruby(Rails/Sinatra)中实现客户端 - 服务器API和授权?

我需要一个关于如何在ruby中实现"客户端 - 服务器"Web应用程序的建议.任何指南和最佳实践都非常感谢.我对Ruby方式和所需的宝石感兴趣,因为它是一个理想的平台,以及实现这些东西的一般方式和逻辑.

我不是一个优秀的红宝石程序员或熟练的系统设计师,可悲地多年,所以我真的需要你的帮助,因为我仍然希望这件事最终会闪耀.

应用程序的当前外观应如下所示:

DB + Auth DB < - > API App < - >其他应用:

  • 数据库 - 一个数据库或一组数据库,其中一个数据库用于用户组(区域).
  • Auth DB - 一个带有个人用户数据和登录信息的DB,即使主数据库在区域之间分割,也可能是单一的.
  • API应用程序 - 这个东西维护着围绕数据,访问控制和翻译的所有逻辑,可能为所有应用程序提供一个翻译基础.
  • 其他应用程序 - 一堆不同的应用程序,与API绑定,这可能是数据提供程序,它使用某些用户的一些数据和不同类型的UI来搜索API.所有应用程序都没有自己的用户相关信息存储空间,只能通过API处理数据.

API应用程序:看起来最好的工具是Sinatra.问题是:

  1. 如何以清晰的方式组织API?Rails为模型和控制器提供了很好的REST路径设置和文件夹结构.有什么提示或宝石可以提高API构建的实际效果吗?
  2. 如何保持访问?Warden看起来不是一个好选择,因为API客户端本身就是Web应用程序.所以我需要某种身份验证令牌.怎么可能呢?某种自定义OAuth提供商?问题是,我不喜欢通过API存储和传递会话cookie的想法,每个请求传递一些访问令牌.这也是

其他应用程序:主要是基于Web的UI.这部分的逻辑选择是Rails.主要问题是如何实现客户端身份验证.设计很酷,但它是否可以使用令牌,或者它是更合适的工具?

ruby authentication api sinatra

5
推荐指数
1
解决办法
1466
查看次数

Sinatra应用程序中的gzip资产

我一直在阅读使用gzip压缩您的资产将提高网站的性能.在Sinatra应用程序中似乎有很多方法可以做到这一点,因此我希望确认最有效和最简单的方法来理解.

我遇到过

use Rack::Deflater
Run Code Online (Sandbox Code Playgroud)

在运行应用程序之前应将其放在我的config.ru文件中,所以在我的情况下

require './david'
use Rack::Deflater
run Sinatra::Application
Run Code Online (Sandbox Code Playgroud)

是吗?是这么简单,只是添加我知道这将拉链我的所有静态资产,包括我的图像,但这些是从CDN提供,所以会有所作为?

Ant帮助赞赏这一个

谢谢

ruby performance gzip assets sinatra

5
推荐指数
1
解决办法
970
查看次数

Sinatra当地人与实例变量

究竟什么是Sinatra的本地人,在模板中使用它们与实例变量之间有什么区别?这是我对当地人的意思:

erb :template, :locals => {:variable => 'value'}
Run Code Online (Sandbox Code Playgroud)

编辑:

在实现方面,实例和局部变量之间有什么区别,使用一个和另一个有什么好处?

ruby sinatra

5
推荐指数
1
解决办法
4401
查看次数

使用Sinatra会话和Rack :: Session :: EncryptedCookie的cookie内容的差异

我正在学习Sinatra框架并开发一个登录系统.我遇到过两种使用cookie的方式.

一个简单的Sinatra内置方式:

enable :sessions
set :session_secret, 'random-key'
Run Code Online (Sandbox Code Playgroud)

登录时,此方法会生成以下cookie内容(用于session.inspect获取输出):

{"session_id"=>"6be0b9a31831604ba51114d265ba952482e0b2da6ced6c54e15ebe7f212858ca", 
"tracking"=>{"HTTP_USER_AGENT"=>"b8c1e8f89eeaea0b825bed0d811f0c7678e98c74", 
"HTTP_ACCEPT_ENCODING"=>"a0bfc876d68fe7aea700da5ea8925abac6f2f794", 
"HTTP_ACCEPT_LANGUAGE"=>"dd065ed263c67d799f943ab6c39b55c5e008cbb5"}, 
"csrf"=>"b480324f510e4f391d15cee8236a8fb74a5aaa5ce2f9ad38e4dbb025a823b16e",    
"name"=>"john"}
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用加密的cookie:

require 'sinatra'
require 'encrypted_cookie'

use Rack::Session::EncryptedCookie, :secret => "random-key"
Run Code Online (Sandbox Code Playgroud)

但是这种方法在登录时会产生以下cookie内容(session.inspect也在这里使用):

{:name=>"john"}
Run Code Online (Sandbox Code Playgroud)

为什么enable :sessions要创建这样一个包含所有信息的大cookie以及为什么需要它(特别是那些HTTP _...部分?)因为Rack::Session::EncryptedCookie没有生成任何信息.

你认为使用enable :sessions应该是首选,因为它有csrf令牌和会话ID?或者你认为这Rack::Session::EncryptedCookie是足够的,因为它是加密的?

我安装了以下版本的gem:

encrypted_cookie (0.0.4)
rack (1.5.2)
rack_csrf (2.4.0)
sinatra (1.4.3)
thin (1.5.1)
Run Code Online (Sandbox Code Playgroud)

如果您需要更多信息,请告诉我......

ruby cookies rack sinatra session-cookies

5
推荐指数
1
解决办法
1395
查看次数

如何在ActiveRecord中重用连接?

当我发现这个简单的API没有自动重用连接时,我正在玩Sinatra和ActiveRecord.

#!/usr/bin/env ruby                                                                                  

require 'sinatra'
require 'active_record'

ActiveRecord::Base.establish_connection(
adapter:  'sqlite3',
database: 'newsletter.db'
)

ActiveRecord::Schema.define do
  create_table :subscribers do |t|
    t.string :email
    t.timestamps
  end
end

class Subscriber < ActiveRecord::Base
  validates :email, presence: true
end

class Newsletter < Sinatra::Base

  set :server, :thin

  get '/subscribers/:email' do
    s = Subscriber.find_by_email(params[:email])
    if s == nil
      status 404
    else
      content_type 'application/json'
      s.to_json
    end
  end

  post '/subscribers/:email' do
    Subscriber.create(email: params[:email])
  end

end

Newsletter.run!
Run Code Online (Sandbox Code Playgroud)

API在前5次订阅用户时返回订户或404.我第六次超时了.在前5个GET中的每一个之后,还有一个读取/写入文件描述符打开newsletter.db.我希望一直只有一个.

如何告诉ActiveRecord重用连接?

ruby activerecord sinatra

5
推荐指数
1
解决办法
656
查看次数