我试图理解现在存在的一些较新的Web编程框架之间的差异,即Node.js,Rails和Sinatra.
有人能给我一个最适合每个框架的应用程序示例吗?
也就是说,什么是一个应用程序,这将是最适合的Node.js,而不是导轨或西纳特拉,什么是一个应用程序,它是最适合的Rails,而不是Node.js和受西纳特拉等.....
我有我的web.rb位置
require 'rubygems'
require 'sinatra'
require "sinatra/reloader"
Run Code Online (Sandbox Code Playgroud)
然后我通过双击web.rb快捷方式启动我的Web应用程序.在web.rb发生任何变化后,我必须退出sinatra并再次运行它.
我认为"sinatra/reloader"会帮助我不要手动显示.
配置(MS Windows)
ruby 1.8.7(2010-08-16 patchlevel 302)[i386-mingw32]
sinatra(1.2.6,1.0)
我在Ruby 1.9.2应用程序中看到了一个错误/功能.对视图(而不是ruby文件)的任何更改都需要重新启动服务器.我最初在Rails应用程序中遇到过这个问题,但我也在最小的Sinatra应用程序中测试了同样的东西.
我将包含一个简单的应用程序来演示
# testapp.rb
require 'sinatra'
get '/' do
[0,1,2].to_s #change this to [0,1].to_s
end
Run Code Online (Sandbox Code Playgroud)
这是我的程序:
ruby testapp.rb (为我运行瘦服务器)在过去的几个月里,我一直在使用Rails 3上的Ruby 1.8.7开发.必须在任何视图更改时重新启动服务器会严重降低开发速度.
我已经准备好了这个SO线程,但是在我的Rails版本(3.1.0 rc4)中,配置变量已根据该答案设置.另外,我可以使用Sinatra复制错误,因此看起来并非如此.
任何人都可以解释这个问题吗?
Ruby版本:ruby 1.9.2p180(2011-02-18修订版30909)[x86_64-linux]服务器:瘦1.2.11(也用Sinatra/Webrick测试过)
编辑7/13,澄清 Sinatra是一个单独的问题 - 默认情况下禁用Sinatra的源重新加载.我用这段代码来测试行为:
require 'sinatra'
require 'sinatra/reloader'
require 'haml'
set :views, 'views'
get '/' do
end
get '/test' do
haml :test
end
Run Code Online (Sandbox Code Playgroud)
有了这个,我做了一个文件:views/test.haml.在服务器运行时修改它确实在重新加载页面时显示更改.感谢Tiredpixel指出这一点
未解决的问题:为什么Ruby 1.9.2上的Rails 3.1没有重新加载视图?我能够加载ruby文件,但不能加载haml和erb文件.我最终重新启动服务器只是为了查看错误是否实际修复(或未修复),因为文件未正确加载.
编辑/解决方案(从我在接受的答案中的评论中复制):
问题在于 config/environments/development.rb
config.cache_classes = false
Run Code Online (Sandbox Code Playgroud)
即使我们检查了这是正确的,我们仍然有问题.我们在文件中进一步向下:
config.threadsafe! …Run Code Online (Sandbox Code Playgroud) 保护使用许多不同形式和mongodb作为数据库的Sinatra应用程序的最佳实践是什么?
在调用我的路由时,我遇到了丢失实例和nilClass错误的问题.在源代码中钻研之后,似乎generate_method调用基本上使用初始方法的块创建了一个新方法.
get "/" do
@some_local_instance.do_something()
end
Run Code Online (Sandbox Code Playgroud)
所以在上面的方法中,很可能在该类中有一个名为some_local_instance的局部变量,但是当实际评估死记硬背时,它没有关于方法定义位置的上下文,因此它将失败.
我问的原因是因为作为我脚本的一部分,我有外部类,当加载Sinatra时会加载哪些注册路由,当调用这些路由时,我需要访问这些类的一些局部变量.一个例子是:
class SomeRouteClass
def initialize(sinatra, calculator)
@calculator = calculator
@sinatra = sinatra
end
def setup_routes
@sinatra.get "/add" do
return @calculator.add(1,1)
end
end
end
class Calculator
def add(a,b)
return a+b;
end
end
sinatra = Sinatra.new
calculator = Calculator.new
routing_class = SomeRouteClass.new(sinatra, calculator)
routing_class.setup_routes
sinatra.run!
Run Code Online (Sandbox Code Playgroud)
原谅任何拼写/语法错误这只是一个简单的例子,但正如你可以看到一个类注册路由以及当该路由被命中时返回一个由实例化它的计算器实例生成的值.
我遇到的问题是,在这个例子中,当我尝试运行/ add路由时,它告诉我@calculator是一个nilClass,我相信它可以归结为Sinatra只是在没有上下文的情况下获取代码块的方式.对于任何简单的模板渲染来说这似乎都很好,但是如果你需要做更多花哨的事情,或者想通过不使用静态和单例来保持你的代码模块化,你似乎没有任何办法解决这个问题......
我的假设在这里是否正确?如果是这样的话,有任何方法可以保持上下文,因为如果我必须将所有东西都写成静态和单例以便从路径进行交互,那么它就会迫使我编写糟糕且难以维护的代码.
==编辑==
重新构建了问题和内容,以更准确地反映实际问题,现在我对库有了更深刻的理解.
目标:使用Sinatra + DataMapper + Postgres + Heroku部署一个简单的测试应用程序
问题:当使用gem'dm-postgres-adapter'gem'dm-sqlite-adapter'将应用程序推送到Heroku时,我得到了这个.使用本机扩展安装do_sqlite3(0.10.7)不幸的是,发生了致命错误.请通过https://github.com/carlhuda/bundler/issues向Bundler问题跟踪器报告此错误,以便我们对其进行修复.谢谢!
我访问了那个github链接,有人遇到了同样的问题,但是被定向到Heroku,https://github.com/carlhuda/bundler/issues/1488.我已经发送电子邮件到Heroku的邮件列表,我正在等待回复.
我遇到了LoadError: no such file to load -- dm-sqlite-adapter
所以我把它添加到Gemfile和Gemfile.lock中,这是我所能得到的
我试图在本地安装和设置Postgres,但那是我正在慢慢学习但却无法开始工作的新的痛苦.
我也在这里用一个类似的问题阅读了每一个问题,有些人向我推进了这一点,有些人没有得到提问者的回答而留下一个谜.
-----------------
source :rubygems
gem 'sinatra', '1.1.0'
gem 'thin', '1.2.7'
gem 'data_mapper'
gem 'dm-postgres-adapter'
gem 'dm-sqlite-adapter'
Run Code Online (Sandbox Code Playgroud)
------------------------
...
dm-sqlite-adapter (1.2.0)
dm-do-adapter (~> 1.2.0)
do_sqlite3 (~> 0.10.6)
...
Run Code Online (Sandbox Code Playgroud)
--------------------
web: bundle exec ruby recall.rb -p $PORT
Run Code Online (Sandbox Code Playgroud)
---------------------
require 'rubygems'
require 'sinatra'
require 'data_mapper'
DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/recall.db")
class Note
include DataMapper::Resource …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的运行在Ruby 1.9.3上的Sinatra应用程序,它使用ERB和markdown模板.我已经剥离它以证明问题.
这是在Mac OS X Snow Leopard上运行Sinatra 1.3.2.对于降价我使用的是rdiscount 1.6.8.
主要的Ruby文件包含
get '/services' do
erb :services
end
Run Code Online (Sandbox Code Playgroud)
services.erb文件中包含以下内容
<%= markdown :'content/service1' %>
£
Run Code Online (Sandbox Code Playgroud)
在markdown文件中我只有一行
£
Run Code Online (Sandbox Code Playgroud)
当我运行Sinatra应用程序并加载'services'页面时,我Encoding::CompatibilityError at /services incompatible character encodings: UTF-8 and ASCII-8BIT在ERB文件的第二行(仅包含'£'的那一行)上获得了异常.
我做了很多谷歌搜索,我不能为我的生活弄清楚为什么会这样.ERB和markdown文件在我的本地磁盘上是UTF-8,但显然它们被Sinatra加载并变成字符串,我不知道如何判断这些字符串的编码.
如果我强迫Sinatra使用ASCII-8BIT(通过添加settings.default_encoding = 'ASCII-8BIT'到我的主要Sinatra Ruby文件的顶部),则不会抛出任何异常但是'£'字符出现错误.
有什么指针吗?
我在Sinatra有一个Haml部分处理我所有的'页面打开'项目,如元标记.
我希望在此部分中为page_title设置变量,然后在每个视图中设置该变量.
部分内容如下:
%title @page_title
Run Code Online (Sandbox Code Playgroud)
然后在视图中,允许执行以下操作:
@page_title = "This is the page title, BOOM!"
Run Code Online (Sandbox Code Playgroud)
我已经阅读了很多问题/帖子等等,但我不知道如何要求解决我想要做的事情.我来自Rails,我们的开发人员通常使用content_for,但他们设置了所有这些.我真的想知道它是如何工作的.似乎我必须定义它并使用:本地人以某种方式,但我还没弄明白.提前感谢您的任何提示!
我刚刚将一个Sinatra应用程序部署到heroku,该应用程序包含两个rake任务:
task :create_db , [:db_id , :db_name]
task :destroy_db , [:db_id, :token]
Run Code Online (Sandbox Code Playgroud)
我跑的时候
heroku run rake -T
Run Code Online (Sandbox Code Playgroud)
在控制台中,Heroku打印以下响应:
(in /app)
rake create_db[db_id,db_name] # Creation count database task
rake destroy_db[db_id,token] # Destroy database task
Run Code Online (Sandbox Code Playgroud)
但是,当我跑:
heroku run rake create_db['test', 'test database']
Run Code Online (Sandbox Code Playgroud)
它响应以下错误:
(in /app)
rake aborted!
Don't know how to build task 'create_db[test,'
/usr/local/lib/ruby/1.9.1/rake.rb:1720:in `[]'
/usr/local/lib/ruby/1.9.1/rake.rb:2040:in `invoke_task'
/usr/local/lib/ruby/1.9.1/rake.rb:2019:in `block (2 levels) in top_level'
/usr/local/lib/ruby/1.9.1/rake.rb:2019:in `each'
/usr/local/lib/ruby/1.9.1/rake.rb:2019:in `block in top_level'
/usr/local/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling'
/usr/local/lib/ruby/1.9.1/rake.rb:2013:in `top_level'
/usr/local/lib/ruby/1.9.1/rake.rb:1992:in `run'
/usr/local/bin/rake:31:in `<main>'
Run Code Online (Sandbox Code Playgroud)
我不太清楚为什么会失败,但我的猜测是它与字符串参数有关.正如您在上面所看到的,它表示"不知道如何构建任务'create_db [test,'测试显示没有字符串.
知道如何从命令行运行此任务吗?
我在sinatra项目中使用ActiveSupport,并遵循一些同行的建议,我一直在使用ActiveSupport :: Dependencies.autoload_paths来简化我在开发中加载我的类.现在我正在接近部署日,我并不知道如何急切地加载它们.在Rails中,这很简单:只需设置config.cache_classes = true并按照自己的方式行事即可.但在Sinatra应用程序中,我没有看到如何急切加载它们.
sinatra ×10
ruby ×5
heroku ×2
database ×1
datamapper ×1
haml ×1
mongodb ×1
node.js ×1
postgresql ×1
rake ×1
ruby-1.9.2 ×1
scope ×1
security ×1
sqlite ×1
webrick ×1