我尝试让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:在'渲染'中......
还有其他要求的文件吗?有任何想法吗 ?
通常,当我在开发期间从控制台运行rails应用程序时,我可以按Ctrl+ C然后退出.然后我可以再次运行应用程序,从而弹出它并实现更改.
我正在运行一个sinatra应用程序.我只是运行ruby文件.
$: ruby myapp.rb
Run Code Online (Sandbox Code Playgroud)
但是,当我按Ctrl+ C时,它不会停止应用程序.我不得不调出Ubuntu系统监视器并终止Ruby进程.很烦人.
有谁见过这个/之前处理过这个?
好吧,这让我发疯了.我已经阅读了协会的文章和例子,并试图在拉斯三天内解决这个问题,我厌倦了这让我感到愚蠢,所以......
如何设置与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) 使用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) 我有两种方法可以做到这一点.
首先是使用:locals => {....}和其他是使用@var_name.我只是想知道哪一个更好/更喜欢?我无法在任何地方找到答案.
谢谢
我需要一个关于如何在ruby中实现"客户端 - 服务器"Web应用程序的建议.任何指南和最佳实践都非常感谢.我对Ruby方式和所需的宝石感兴趣,因为它是一个理想的平台,以及实现这些东西的一般方式和逻辑.
我不是一个优秀的红宝石程序员或熟练的系统设计师,可悲地多年,所以我真的需要你的帮助,因为我仍然希望这件事最终会闪耀.
应用程序的当前外观应如下所示:
DB + Auth DB < - > API App < - >其他应用:
API应用程序:看起来最好的工具是Sinatra.问题是:
其他应用程序:主要是基于Web的UI.这部分的逻辑选择是Rails.主要问题是如何实现客户端身份验证.设计很酷,但它是否可以使用令牌,或者它是更合适的工具?
我一直在阅读使用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帮助赞赏这一个
谢谢
究竟什么是Sinatra的本地人,在模板中使用它们与实例变量之间有什么区别?这是我对当地人的意思:
erb :template, :locals => {:variable => 'value'}
Run Code Online (Sandbox Code Playgroud)
编辑:
在实现方面,实例和局部变量之间有什么区别,使用一个和另一个有什么好处?
我正在学习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)
如果您需要更多信息,请告诉我......
当我发现这个简单的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重用连接?