在Ruby中使用Sinatra,您可以通过执行以下操作来设置服务器的设置:
set :myvariable, "MyValue"
Run Code Online (Sandbox Code Playgroud)
然后在模板等的任何地方访问它settings.myvariable.
在我的脚本中,我需要能够将这些变量重新设置为一堆默认值.我认为最简单的方法set是在Sinatra服务器的开头执行所有调用它的函数,当我需要进行更改时:
class MyApp < Sinatra::Application
helpers do
def set_settings
s = settings_from_yaml()
set :myvariable, s['MyVariable'] || "default"
end
end
# Here I would expect to be able to do:
set_settings()
# But the function isn't found!
get '/my_path' do
if things_go_right
set_settings
end
end
# Etc
end
Run Code Online (Sandbox Code Playgroud)
正如上面的代码中所解释的那样,set_settings找不到该函数,我是否采用了错误的方法?
启动基本的Sinatra应用程序.它似乎没有使用我的布局模板.如果我在layout.haml中放入垃圾,我会收到有关它的Sinatra 500错误页面,而不是正确形成的haml文件.运行Ruby 1.9.2.在Windows上,今天晚上安装了Sinatra,Haml和Rack的宝石.
应用代码:
require 'rubygems'
require 'sinatra'
require 'haml'
set :haml, :format => :html5
get '/' do
"Hello world, it's #{Time.now} at the server!"
end
Run Code Online (Sandbox Code Playgroud)
App的位置/ views/layout.haml
%html
%body
= yield
Run Code Online (Sandbox Code Playgroud)
生成的源"http:// localhost:4567 /"页面
Hello world, it's 2011-11-05 02:25:48 -0400 at the server!
Run Code Online (Sandbox Code Playgroud)
^注意我的布局不足.
我使用Omniauth让用户使用Github登录.
步骤1.发送给用户/auth/github,然后重定向到github进行登录.
步骤2.用户验证自身,Github返回此字符串和code参数:
<# extra=# private_gists=0 public_gists=0 public_repos=0 total_private_repos=0 type="User" url="https://api.github.com/users/XXXXX">> info=#> provider="github" uid=13XXXXX>
params[:code] = CODEXXXXXXXXX
Run Code Online (Sandbox Code Playgroud)
步骤2.然后,我尝试通过发送邮件请求来检索令牌:
https://github.com/login/oauth/access_token
Run Code Online (Sandbox Code Playgroud)
使用参数:client_id,client_secret和步骤1中收到的代码,但我得到404.
问题1:这些步骤是正确的还是我遗漏了什么?
问题2:成功登录后我需要在数据库中保存哪些参数进行身份验证(我使用的是用户模型).
我是一个Ruby新手,如果这个问题很简单,请道歉.非常感谢您的帮助.
我们有一个部署在Heroku上的Sinatra应用程序.我们正在尝试添加一个发送简单电子邮件的页面.我已将SendGrid插件添加到Heroku应用程序中.现在,我只是尝试添加使用SendGrid SMTP服务器信息创建和发送消息的Ruby代码.
我遇到的问题是即使我在Heroku应用程序上安装了Mail gem(通过添加到Gemfile中),当Heroku应用程序启动时抱怨"treetop/runtime"未安装时出现错误:
?[32m2012-04-03T16:37:49+00:00 app[web.1]:?[0m /app/.bundle/gems/ruby/1.9.1/gems/mail-2.4.4/lib/mail.rb:75:in `require': no such file to load -- treetop/runtime (LoadError)
?[32m2012-04-03T16:37:49+00:00 app[web.1]:?[0m from /app/.bundle/gems/ruby/1.9.1/gems/mail-2.4.4/lib/mail.rb:75:in `rescue in block in <module:Mail>'
?[32m2012-04-03T16:37:49+00:00 app[web.1]:?[0m from /app/.bundle/gems/ruby/1.9.1/gems/mail-2.4.4/lib/mail.rb:69:in `block in <module:Mail>'
?[32m2012-04-03T16:37:49+00:00 app[web.1]:?[0m from /app/.bundle/gems/ruby/1.9.1/gems/mail-2.4.4/lib/mail.rb:68:in `each'
?[32m2012-04-03T16:37:49+00:00 app[web.1]:?[0m from /app/.bundle/gems/ruby/1.9.1/gems/mail-2.4.4/lib/mail.rb:68:in `<module:Mail>'
?[32m2012-04-03T16:37:49+00:00 app[web.1]:?[0m from /app/.bundle/gems/ruby/1.9.1/gems/mail-2.4.4/lib/mail.rb:2:in `<top (required)>'
?[32m2012-04-03T16:37:49+00:00 app[web.1]:?[0m from /usr/ruby1.9.2/lib/ruby/gems/1.9.1/gems/bundler-1.0.7/lib/bundler/runtime.rb:64:in `require'
Run Code Online (Sandbox Code Playgroud)
同样,当我尝试安装Pony gem时,它抱怨它无法加载Mail.奇怪的是,这一切都适用于我的本地系统,所以我认为这是Heroku的一个问题.我无法让Heroku从Pony或Mail中完全加载所需的一切,以便成功启动.(注意:我甚至无法启动Heroku,因此我甚至无法测试实际发送的电子邮件代码.)
任何具体的帮助/见解将不胜感激.Heroku有没有遇到过这个?还有其他宝石可以用于这个简单的目的吗?
谢谢!
PS捆绑包成功安装了邮件(2.4.4)和小马(1.4).
我正在使用Sinatra构建一个应用程序.应用程序运行得很好,除了我最近添加一个元素到一个具有特殊字符(Yóü)的数组.
@peeps = ["Joe", "James", "Phil", "Jane", "Yóü"]
Run Code Online (Sandbox Code Playgroud)
我使用这个数组来做很多事情,虽然我不确定我是否需要在这篇文章中包含它们.当我运行我的应用程序时,我在浏览器中收到以下错误消息:
Internal Server Error: invalid byte sequence in US-ASCII
Run Code Online (Sandbox Code Playgroud)
在我的终端窗口中,运行后我看到以下内容 ruby app.rb
app.rb:34: invalid multibyte char (US-ASCII)
app.rb:34: invalid multibyte char (US-ASCII)
app.rb:34: syntax error, unexpected $end, expecting ']'
Run Code Online (Sandbox Code Playgroud)
此外,为了它的价值,我通常使用霰弹枪来运行我的服务器,因为我可以进行更改并只刷新页面.那是我跑的时候显示这个错误shotgun app.rb
[2012-08-16 21:36:37] ERROR ArgumentError: invalid byte sequence in US-ASCII
/Users/me/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/rack-1.4.1/lib/rack/utils.rb:182:in `gsub'
/Users/me/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/rack-1.4.1/lib/rack/utils.rb:182:in `escape_html'
/Users/me/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/shotgun-0.9/lib/shotgun/loader.rb:76:in `format_error'
/Users/me/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/shotgun-0.9/lib/shotgun/loader.rb:52:in `proceed_as_parent'
/Users/me/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/shotgun-0.9/lib/shotgun/loader.rb:28:in `call!'
/Users/me/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/shotgun-0.9/lib/shotgun/loader.rb:18:in `call'
/Users/me/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/shotgun-0.9/lib/shotgun/favicon.rb:12:in `call'
/Users/me/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/shotgun-0.9/lib/shotgun/static.rb:14:in `call'
/Users/me/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/rack-1.4.1/lib/rack/builder.rb:134:in `call'
/Users/me/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/rack-1.4.1/lib/rack/handler/webrick.rb:59:in `service'
/Users/me/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
/Users/me/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
/Users/me/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'
Run Code Online (Sandbox Code Playgroud) 我想在sinatra中使用相同的路由处理程序处理多个URL:
目前我有:
get 'autocomplete' do
Run Code Online (Sandbox Code Playgroud)
但理想情况下我想:
get 'autocomplete_contacts', 'autocomplete_users', 'autocomplete_companies' do
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我还需要一种让联系人/用户/公司离开路径的方法吗?
这可以在sinatra完成吗?
我只想将位于公共目录中的.txt文件显示在页面上.我很抱歉这似乎是新手,但我是Ruby新手.
到目前为止,ruby sinatra代码为:
get '/create' do
logfile = File.open("logfile.txt")
erb :create
end
Run Code Online (Sandbox Code Playgroud)
并且erb读取:
<h2>Text file:</h2>
<%= logfile %>
Run Code Online (Sandbox Code Playgroud)
有人能告诉我在页面上显示这个文本文件需要什么吗?
我在Sinatra项目中使用RSpec.我正在测试一个运行after_find钩子的模型来初始化一些值.我需要在每次运行之前擦除数据库,经过一些搜索后,我的规范帮助文件如下所示:
require "pry"
require "factory_girl_rails"
require "rspec-rails"
FactoryGirl.find_definitions
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)
RSpec.configure do |config|
config.use_transactional_fixtures = true
end
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
undefined method `use_transactional_fixtures=' for #<RSpec::Core::Configuration:0x007fc1c89397e8> (NoMethodError)`
Run Code Online (Sandbox Code Playgroud)
我查阅了RSpec :: Core :: Configuration的文档,唯一提到的use_transactional_fixtures=是它特别指出它是特定于rails的.我安装了'rspec-rails'宝石,所以我不知道它为什么不使用它.我甚至在spec帮助文件中要求它.
我最初的想法是创建一个运行db:drop,db:create和db:migrate然后测试的Rakefile,但我希望有一个稍微简单的方法 use_transactional_fixtures=
我有一个非常简单的Sinatra应用程序,允许我通过我的Twilio号码接收短信,并将它们打印到应用程序运行的同一个终端会话.我想将这些消息保存到本地.csv文件.添加CSV.open()到应用程序会引发一些错误.
require 'sinatra'
require 'twilio-ruby'
require 'csv'
post '/receive_sms' do
@body = params["Body"].to_s
@sid = params["MessageSid"].to_s
@sender = params["From"].delete('+').to_i
content_type 'text/xml'
puts @body
puts @sender
puts @sid
CSV.open("/home/ubuntu/Twilio_SMS/smsLog.csv", "a") do |csv|
csv << [@sender, @body, @sid]
end
end
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误:
ERROR IOError: closed stream
/home/ubuntu/.rvm/gems/ruby-2.2.1/gems/rack-1.6.4/lib/rack/body_proxy.rb:16:in `close'
/home/ubuntu/.rvm/gems/ruby-2.2.1/gems/rack-1.6.4/lib/rack/handler/webrick.rb:117:in `ensure in service'
/home/ubuntu/.rvm/gems/ruby-2.2.1/gems/rack-1.6.4/lib/rack/handler/webrick.rb:117:in `service'
/home/ubuntu/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/httpserver.rb:138:in `service'
/home/ubuntu/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/httpserver.rb:94:in `run'
/home/ubuntu/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/server.rb:294:in `block in start_thread'
Run Code Online (Sandbox Code Playgroud)
我尝试在post方法之外移动CSV调用,但这只会, ,在每次启动应用程序时写入文件.
将此信息保存到CSV文件的正确方法是什么,并确保即使快速连续收到每条消息也会添加?
我需要在一个从Sinatra :: Base子类化的Ruby类中访问某些私有方法中的某些功能.
类定义的开头如下:
class Geminabox < Sinatra::Base
Run Code Online (Sandbox Code Playgroud)
它从一系列代码块开始,如下所示:
get '/' do
@gems = load_gems
@index_gems = index_gems(@gems)
erb :index
end
Run Code Online (Sandbox Code Playgroud)
其中'load_gems'和'index_gems'是稍后在同一个类中定义的私有方法.
但是,如果我将此类加载到irb控制台并创建如下的实例:
g=Geminabox.new
Run Code Online (Sandbox Code Playgroud)
然后尝试查看我得到的私有方法:
> 2.2.1 :005 > g.private_methods(false)
=> [:initialize]
> 2.2.1 :006 >
Run Code Online (Sandbox Code Playgroud)
没有'load_gems',没有'index_gems'等等,我不能使用'send'调用其中任何一个:
2.2.1 :007 > g.send(:load_gems)
NoMethodError: undefined method `load_gems' for #<Geminabox app_file="/apps/geminabox/lib/geminabox.rb">
from (irb):7
from /usr/local/rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>'
2.2.1 :008 >
Run Code Online (Sandbox Code Playgroud)
我不明白为什么,我希望有人可以启发我.