我经常需要抛出一个自定义(错误)错误.就像由于参数不匹配而无法找到资源时.
我更喜欢抛出现有错误,或抛出从现有错误继承的错误.这样,我不会引入已经定义的错误类,并且可以完美地使用(DRY).但它也允许保持措辞和风格相同,通过继承和简单地改变一两个字来澄清与原始错误的差异.
例如:
Foo.new
Foo.some_external_id = nil
Foo.fetch_external_resource
# => InvalidOptions: Calling Foo#fetch_external_resource with nil is invalid
Run Code Online (Sandbox Code Playgroud)
我很确定已经定义了这样的错误.事实上,在通过多行代码阅读后,我发现我的MongoID驱动程序已经存在Mongoid::Errors::InvalidOptions: Calling Document#find with nil is invalid.
Ruby Core和Ruby on Rails中是否有可用的错误类列表?有没有办法为您当前的项目获得这样的列表?
重新使用和/或继承现有错误是否很聪明,或者我应该维护自己的自定义设置?
在PHP中,我经常写类似的行
isset($foo)? NULL : $foo = 'bar'
Run Code Online (Sandbox Code Playgroud)
在红宝石中有一个明亮的捷径,叫做或等于
foo ||= 'bar'
Run Code Online (Sandbox Code Playgroud)
PHP有这样的操作符,快捷方式或方法调用吗?我找不到一个,但我可能错过了它.
我有一个我要重命名的宝石.它发布在RubyGems上.我最担心的是人们想要更新它.
我看到两条路,但是真的想听听那些重命名他们的宝石的人,他们是怎么做到的.
smart-cropper)smart-cropper为croptoelie(旧宝石)的依赖croptoelie我看到的一个问题是,它太透明了,人们可能不会意识到他们使用的宝石不再被维护.
另一个问题是版本控制变得更难:每次我发布一个新版本的renamed(smart-cropper)gem时,我都必须碰到旧版"metapackage"的版本,否则人们永远不会得到新版本.
我可以发送一个旧宝石的版本,只是抛出弃用警告,并发出一条消息,人们应该安装新的宝石.
我看到的问题是它可能非常具有侵入性,可能会让人们[1]完全脱离宝石.
还有其他选择吗?"RubyGems"中是否有内容可以满足更改名称的需要?
[1]并不是说有太多人在使用它; 因为这个名字很难找到.:)
现在,我做了
get '/' do
set :base_url, "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}"
# ...
haml :index
end
Run Code Online (Sandbox Code Playgroud)
能够在HAML index.haml中使用options.base_url.但我确信有更好的,干的,这样做的方式.然而,我看不到,也找不到它.(我是Sinatra的新手:))
不知何故,在get之外,我没有request.env可用,或者看起来如此.因此将它放入包含中并不起作用.
你如何得到你的基本网址?
我有一些解析Nokogiri::XML::Document对象,我想打印为JSON.
我可以将它变成一个字符串,将其解析为哈希,使用active-record或Crack然后使用Hash.to_json; 但这既丑陋又依赖于manay库.
有没有更简单的方法?
根据评论中的请求,例如,XML <root a="b"><a>b</a></root>可以表示为JSON:
<root a="b"><a>b</a></root> #=> {"root":{"a":"b"}}
<root foo="bar"><a>b</a></root> #=> {"root":{"a":"b","foo":"bar"}}
Run Code Online (Sandbox Code Playgroud)
这也是我现在用Crack得到的.实际上,实体和子标签之间的冲突是一个潜在的问题,但我自己构建了大部分XML,因此最简单的方法就是完全避免这些冲突:)
我刚从github下载了一个应用程序代码,当我尝试运行该命令时rails s,我收到此错误 -
The program 'rails' can be found in the following packages:
* rails
* ruby-railties-3.2
Run Code Online (Sandbox Code Playgroud)
这仅适用于此应用,有人可以告诉我如何解决这个问题吗?我正在使用RVM
我有以下内容:
foo ||= []
foo << "bar"
Run Code Online (Sandbox Code Playgroud)
而且我相信这可以在一行中完成,我无法找到.
重要的是,foo可能存在,也可能不存在.如果存在则它始终是一个Array,如果它不存在,它必须成为一个数组并获得一个附加到它的变量.
当我运行我的rspec测试时,许多因我的mongodb数据库中的陈旧数据而失败.AFAIK用干净的数据库进行测试要好得多.
使用mysql,我可以运行rake db:test:prepare清理数据库.如何在每次测试之前清理nd /或重新种子数据库?
我想使用array_filter函数过滤数组.它提示在水下使用call_user_func,但没有提及有关如何在类/对象的上下文中使用的任何内容.
一些伪代码解释了我的目标:
class RelatedSearchBlock {
//...
private function get_filtered_docs() {
return array_filter($this->get_docs(), 'filter_item');
}
private filter_item() {
return ($doc->somevalue == 123)
}
}
Run Code Online (Sandbox Code Playgroud)
我需要'filter_item'换成array($this, 'filter_item')吗?我想要的是什么?
我想设置一个环境变量,然后在PHP中访问它,但无法找到如何执行此操作.
在(linux)shell中,我运行:
$ APP_ENV="development"
$ export $APP_ENV
Run Code Online (Sandbox Code Playgroud)
然后我运行一个简单的测试脚本testenv.php:
<?php
print $_ENV["APP_ENV"];
print getenv("APP_ENV");
Run Code Online (Sandbox Code Playgroud)
从设置该变量的同一个shell:
$ php testenv.php
Run Code Online (Sandbox Code Playgroud)
这没有打印并发出通知:
Notice: Undefined index: APP_ENV in /xxxx/envtest.php on line 2
Run Code Online (Sandbox Code Playgroud)
注意事项是有道理的,因为在环境变量中根本找不到APP_ENV,不会getenv()抛出任何警告但只返回任何内容.
我错过了什么?