标签: ruby

如何使用RSpec的should_raise与任何类型的异常?

我想做这样的事情:

some_method.should_raise <any kind of exception, I don't care>
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

some_method.should_raise exception
Run Code Online (Sandbox Code Playgroud)

......不起作用.

ruby rspec exception-handling ruby-on-rails

211
推荐指数
5
解决办法
9万
查看次数

在Ruby中拆分多行上的长字符串而不删除换行符

我们最近在工作中决定采用红宝石风格指南.其中一条规则是任何行都不应超过80个字符.由于这是一个Rails项目,我们经常会有一些更长的字符串 - 即" 用户X想要向您发送有关Thing Y的消息 ",这并不总是符合80个字符的样式限制.

我知道有三种方法可以让长字符串跨越多行:

  • HEREDOC
  • %Q {}
  • 实际字符串连接.

然而,所有这些情况最终都需要更多的计算周期,这看起来很愚蠢.字符串连接显然,但是HEREDOC,%Q我必须通过类似的方式删除换行符.gsub(/\n$/, '').

有没有纯语法方法来做到这一点,这相当于只需要将整个字符串放在一行上?显然,目标是不要花费任何额外的周期,因为我希望我的代码更具可读性.(是的,我意识到你必须做出很多权衡......但是对于字符串长度来说,这看起来很愚蠢.)

更新:反斜杠不是我想要的,因为你会丢失缩进,这实际上会影响样式/可读性.

例:

if foo
  string = "this is a \  
string that spans lines"  
end
Run Code Online (Sandbox Code Playgroud)

我发现上面有点难以阅读.

编辑:我在下面添加了一个答案; 三年后,我们现在有了波浪形的heredoc.

ruby ruby-on-rails

211
推荐指数
6
解决办法
11万
查看次数

如何获取在Ruby中迭代哈希的特定输出?

我希望得到一个迭代Ruby Hash的特定输出.

这是我想迭代的哈希:

hash = {
  1 => ['a', 'b'], 
  2 => ['c'], 
  3 => ['d', 'e', 'f', 'g'], 
  4 => ['h']
}
Run Code Online (Sandbox Code Playgroud)

这是我想得到的输出:

1-----

a

b

2-----

c

3-----

d 

e

f

g

4-----

h
Run Code Online (Sandbox Code Playgroud)

在Ruby中,如何使用Hash获得这样的输出?

ruby hash output

210
推荐指数
5
解决办法
28万
查看次数

如何在Rails环境中将参数传递给Rake任务?

我能够传递如下参数:

desc "Testing args"
task: :hello, :user, :message do |t, args|
  args.with_defaults(:message => "Thanks for logging on")
  puts "Hello #{args[:user]}. #{:message}"
end
Run Code Online (Sandbox Code Playgroud)

我还能够为Rails应用程序加载当前环境

desc "Testing environment"
task: :hello => :environment do 
  puts "Hello #{User.first.name}."
end
Run Code Online (Sandbox Code Playgroud)

我想做的是能够拥有变量和环境

desc "Testing environment and variables"
task: :hello => :environment, :message do |t, args|
  args.with_defaults(:message => "Thanks for logging on")
  puts "Hello #{User.first.name}. #{:message}"
end
Run Code Online (Sandbox Code Playgroud)

但这不是一个有效的任务调用.有谁知道我怎么能做到这一点?

ruby rake ruby-on-rails

210
推荐指数
5
解决办法
9万
查看次数

Ruby:过滤哈希密钥的最简单方法?

我有一个看起来像这样的哈希:

params = { :irrelevant => "A String",
           :choice1 => "Oh look, another one",
           :choice2 => "Even more strings",
           :choice3 => "But wait",
           :irrelevant2 => "The last string" }
Run Code Online (Sandbox Code Playgroud)

我想要一种简单的方法来拒绝所有不是选择+ int的键.它可以是choice1,或者choice1到choice10.它有所不同.

如何仅使用单词选择和后面的一个或多个数字来单独输出键?

奖金:

将哈希值转换为带有制表符(\ t)作为分隔符的字符串.我这样做了,但需要几行代码.通常,大师级的Rubician可以在一个左右的行中完成.

ruby

210
推荐指数
11
解决办法
17万
查看次数

无法安装pg gem

我尝试使用,gem install pg但它似乎没有用.

gem install pg 给出了这个错误

Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
ERROR:  Error installing pg:
        ERROR: Failed to build gem native extension.

C:/Ruby/bin/ruby.exe extconf.rb
checking for pg_config... no
No pg_config... trying anyway. If building fails, please try again with
 --with-pg-config=/path/to/pg_config
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. …
Run Code Online (Sandbox Code Playgroud)

ruby installation rubygems ruby-on-rails

209
推荐指数
10
解决办法
13万
查看次数

如何创建退出邮件

是否有单行函数调用退出程序并显示消息?我在Perl中知道它很简单:

die("Message goes here")
Run Code Online (Sandbox Code Playgroud)

我厌倦了打字:

puts "Message goes here"
exit
Run Code Online (Sandbox Code Playgroud)

ruby

207
推荐指数
2
解决办法
10万
查看次数

在Ruby中将整数转换为十六进制字符串

是否有内置的方法将Ruby中的整数转换为十六进制等效?

与之相反的是String#to_i:

"0A".to_i(16) #=>10
Run Code Online (Sandbox Code Playgroud)

或许像:

"0A".hex #=>10
Run Code Online (Sandbox Code Playgroud)

我知道如何自己动手,但使用内置的Ruby函数效率可能更高.

ruby hex base-conversion

204
推荐指数
5
解决办法
13万
查看次数

如何找到Rails中的当前路由?

我需要知道Rails中过滤器中的当前路由.我该怎么知道它是什么?

我正在做REST资源,并且看不到命名路由.

ruby routing ruby-on-rails

204
推荐指数
8
解决办法
16万
查看次数

double*(splat)运算符的作用是什么

你见过像这样声明的函数吗?

def foo a, **b
  ...
end
Run Code Online (Sandbox Code Playgroud)

我知道单个*是splat运算符.什么**意思?

ruby splat

204
推荐指数
3
解决办法
5万
查看次数