我正在使用Sinatra,我想设置一些Rails具有的便利rake任务,特别是rake db:seed.
我的第一关是这个:
namespace :db do
desc 'Load the seed data from db/seeds.rb'
task :seed do
seed_file = File.join(File.dirname(__FILE__), 'db', 'seeds.rb')
system("racksh < #{seed_file}")
end
end
Run Code Online (Sandbox Code Playgroud)
racksh是一个模仿Rails控制台的宝石.所以我只是将种子文件中的代码直接输入它.它有效,但显然不理想.我想做的是创建一个环境任务,允许命令在Sinanta应用程序/环境下运行,如下所示:
task :environment do
# what goes here?
end
task :seed => :environment do
seed_file = File.join(File.dirname(__FILE__), 'db', 'seeds.rb')
load(seed_file) if File.exist?(seed_file)
end
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何设置环境,以便rake任务可以在其下运行.任何帮助将非常感激.
我被问到为什么"我在我的视图中创建了复杂的Ruby变量.我的控制器不应该声明这些变量吗?"
我的sinatra控制器是我的.rb文件吗?我有一个.rb文件和视图视图.
有没有办法覆盖sinatra默认的NotFound错误页面("Sinatra不知道这个小曲")?我希望sinatra只显示一个普通的字符串作为"找不到方法",当它找不到合适的路由时,但是当我从路由中引发404错误时,我希望它显示传入的错误消息.
像这样实现not_found块:
not_found do
'Method not found.'
end
Run Code Online (Sandbox Code Playgroud)
工作,但它不是一个有效的选项,因为我希望能够从这样的路线抛出我自己的NotFound错误消息:
get '/' do
begin
# some processing that can raise an exception if resource not found
rescue => e
error 404, e.message.to_json
end
end
Run Code Online (Sandbox Code Playgroud)
但正如预期的那样,not_found块会覆盖我的错误消息.
我为我正在启动的sinatra应用程序设置了一个项目级别的RVM gemset,它将使用Active Record连接到本地数据库.为了测试它,我尝试运行以下测试应用程序:
test.rb
require 'rubygems' # may not be needed, depending on platform
require 'sinatra'
require 'activerecord'
class Article < ActiveRecord::Base
end
get '/' do
Test.establish_connection(
:adapter => "sqlite3",
:database => "hw.db"
)
Test.first.content
end
Run Code Online (Sandbox Code Playgroud)
(摘自这个问题的答案:使用Sinatra时与数据库交谈的最佳方式是什么?)
当我运行时,ruby -rubygems test.rb我收到此错误:
/Users/[user]/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- activerecord (LoadError)
Run Code Online (Sandbox Code Playgroud)
我已经安装了Active Record gem,它会显示出来gem list并rvm current显示正确的gemset.我是RVM的新手,我认为这与它没有正确的加载路径有关,但我觉得我已经正确设置了所有内容,所以我很欣赏有关错误的建议.谢谢.
如果我有以下Sinatra代码:
get '/hi' do
erb :hello
end
Run Code Online (Sandbox Code Playgroud)
如果我有一个名为的文件,这很好用views/hello.erb.但是,如果我有一个名为views/hello.html.erbSinatra的文件找不到该文件并给我一个错误.我如何告诉Sinatra我希望它.html.erb作为有效的.erb扩展名寻找?
似乎Sinatra的记录器仅在请求处理程序中可用(请参阅https://github.com/sinatra/sinatra#logging),但如果我想在其他地方使用记录器,例如在帮助程序方法或配置中,该怎么办?钩?Sinatra记录仪是否可通过其他方式获得?
我需要用Sinatra制作一些看起来像的方法:
访问http //:本地主机:1234 /添加string_to_add
但是当我宣布它是这样的:
get "/add?:string_to_add" do
...
end
Run Code Online (Sandbox Code Playgroud)
它没有看到string_to_add参数.
我应该如何声明我的方法并使用此参数来使事情有效?
我有400状态代码的自定义错误消息:
get '/do' do
raise ParamXMissingError unless params['x']
end
error ParamXMissingError do
haml :custom_error_page
end
Run Code Online (Sandbox Code Playgroud)
我希望ParamXMissingError为400,但是当我运行上面的代码,并通过Firefox网络工具检查时,似乎Sinatra实际上返回500而不是400.如何让它显示custom_error_page.haml并返回400?
最好是从错误块中处理状态代码和页面是很好的,而不是我在提升时会撒上的东西ParamXMissingError.例如,这将是重复的,并不是一个好的解决方案:halt 400, haml(:custom_error_page)
我有一个简单的Sinatra休息,我无法捕获错误.我也承认我对Ruby和Sinatra很新.
当我在post端点中引发并出错时,我想报告传入的文档.我需要1)处理post结果中的错误(我可以访问@incoming)或2)将传入的文档传递给错误并在那里报告.
什么是更好的选择,选项1或选项2?
以下是我的代码示例:
post ('/result') do
begin
@incoming = JSON.parse(request.body.read)
//do something that causes an error
rescue
e = env['sinatra.error']
url = request.url
ip = request.ip
@actlogpassblock = { :message => e.message,
:path => url,
:ip => ip,
:timestamp => Time.new,
:type => "500",
:sub => "RES",
:payload => @incoming
}
action_log.insert(@actlogpassblock)
status 500
end
end
error do
status 500
e = env['sinatra.error']
url = request.url
ip = request.ip
backtrace = "Application error\n#{e}\n#{e.backtrace.join("\n")}"
@actlogpassblock = { :message …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用本教程将我的Sinatra应用程序连接到PostgreSQL数据库:http://samuelstern.wordpress.com/2012/11/28/making-a-simple-database-driven-website-with-sinatra-and-heroku /.一切顺利,直到我尝试执行:
rake:db migrate
Run Code Online (Sandbox Code Playgroud)
然后我收到这个错误:
rake aborted!
PG::ConnectionBad: fe_sendauth: no password supplied
Run Code Online (Sandbox Code Playgroud)
好像我应该在pg_hba.conf文件中更改我的权限,但是,打开它,我什么也看不见.并且,如果我尝试在其中写入内容,它会说它是" 只读 ".
我是否正确摆脱错误以及下一步该走向何方?
编辑:实际上,如果我尝试从另一个文本编辑器打开它,它说我没有权限.