标签: ruby

捕获ruby异常中的行号

请考虑以下ruby代码

test.rb:

begin

  puts
  thisFunctionDoesNotExist
  x = 1+1
rescue Exception => e
  p e
end
Run Code Online (Sandbox Code Playgroud)

出于调试目的,我希望救援块知道该文件的第4行发生了错误.这样做有干净的方法吗?

ruby exception

48
推荐指数
4
解决办法
2万
查看次数

ruby中的常量或类变量?

我已经在Ruby中编程了几个月了,我想知道什么时候使用常量而不是类变量,反之亦然.(我在Rails工作,考虑模型中的常量).

class Category
  TYPES = %w(listing event business).freeze
end
Run Code Online (Sandbox Code Playgroud)

要么

class Category
  @@types = %w(listing event business).freeze
  cattr_reader :types
end
Run Code Online (Sandbox Code Playgroud)

是否存在一种优于另一种情况的情况?或者只是品味/风格问题?

ruby constants class-variables

48
推荐指数
3
解决办法
2万
查看次数

48
推荐指数
7
解决办法
4万
查看次数

Ruby,PHP的交互式控制台

如何为ruby和php启动交互式控制台

php ruby

48
推荐指数
2
解决办法
3万
查看次数

从Rails中的gem重写模块方法

will_paginate gem在我的Oracle版本上被破坏了.paginate_by_sqlWillPaginate模块中的默认方法是在查询中插入额外的"AS"并使其失败.

代码本身很容易修复,但我不确定让Rails接受我的更改的最佳方法.

我不想更改gem本身的代码,因为这会使我的代码在其他机器上被破坏.

我尝试创建一个包含以下内容的lib/test.rb文件:

module WillPaginate
  def paginate_by_sql
    (my code goes here)
  end
end
Run Code Online (Sandbox Code Playgroud)

并要求它来自environment.rb,但它没有接受我的更改.我也尝试过来自controllers/application.rb,但是再次提到我的更改.

暂时,我通过覆盖特定模型本身的方法来使其工作,但这有点像黑客,并且意味着我不能在该项目中的任何其他模型上使用它.

我确信有一个简单的方法可以做到这一点,但我没有运气跟踪它使用谷歌.

ruby gem ruby-on-rails will-paginate

48
推荐指数
3
解决办法
4万
查看次数

我应该在ruby脚本中定义一个main方法吗?

在python中,模块不必具有 main函数,但通常的做法是使用以下习语:

def my_main_function():
    ... # some code

if __name__=="__main__":  # program's entry point
    my_main_function()
Run Code Online (Sandbox Code Playgroud)

我知道红宝石不具备有一个main方法要么,但有某种我应遵循最佳实践?我应该说出我的方法main或其他什么?

关于主要方法维基百科页面并没有真正帮助我.


作为旁注,我在python中也看到了以下习语:

def my_main_function(args=[]):
    ... # some code

if __name__=="__main__":  # program's entry point
    import sys
    sys.exit(my_main_function(sys.argv))
Run Code Online (Sandbox Code Playgroud)

ruby main-method

48
推荐指数
3
解决办法
2万
查看次数

Capistrano&Bash:忽略命令退出状态

我正在使用Capistrano运行远程任务.我的任务看起来像这样:

task :my_task do
  run "my_command"
end
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果my_command退出状态!= 0,那么Capistrano认为它失败并退出.当退出状态不为0时,如何在退出时让capistrano继续运行?我已经改变my_commandmy_command;echo它并且它有效,但感觉就像一个黑客.

ruby bash capistrano ruby-on-rails

48
推荐指数
5
解决办法
2万
查看次数

Ruby - 在模块/类之间共享记录器实例

处理一个小的Ruby脚本,该脚本可以访问Web并抓取各种服务.我有一个包含几个类的模块:

module Crawler
  class Runner
  class Options
  class Engine
end
Run Code Online (Sandbox Code Playgroud)

我想在所有这些类中共享一个记录器.通常我只是将它放在模块中的常量中并像这样引用它:

Crawler::LOGGER.info("Hello, world")
Run Code Online (Sandbox Code Playgroud)

问题是,在我知道输出的位置之前,我无法创建我的记录器实例.您可以通过命令行启动爬网程序,此时您可以告诉它您要在开发中运行(日志输出转到STDOUT)或生产(日志输出转到文件,crawler.log):

crawler --environment=production
Run Code Online (Sandbox Code Playgroud)

我有一个类Options解析通过命令行传入的选项.只有在那时我才知道如何使用正确的输出位置实例化记录器.

所以,我的问题是:我如何/在哪里放置我的记录器对象,以便我的所有类都可以访问它?

我可以将我的记录器实例传递给new()我创建的每个类实例的每个调用,但我知道必须有一个更好的Rubyish方法来实现它.我正在想象与模块共享的一些奇怪的类变量class << self或其他魔法.:)

更多细节:Runner通过将命令行选项传递给Options类来启动所有内容,并获取具有几个实例变量的对象:

module Crawler
  class Runner
    def initialize(argv)
      @options = Options.new(argv)
      # feels like logger initialization should go here
      # @options.log_output => STDOUT or string (log file name)
      # @options.log_level => Logger::DEBUG or Logger::INFO
      @engine = Engine.new()
    end
    def run
      @engine.go
    end
  end
end

runner = Runner.new(ARGV)
runner.run
Run Code Online (Sandbox Code Playgroud)

我需要代码Engine …

ruby logging class-design

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

Rails 3.如何获得两个数组之间的差异?

假设我有这个带有出货ID的数组.

s = Shipment.find(:all, :select => "id")

[#<Shipment id: 1>, #<Shipment id: 2>, #<Shipment id: 3>, #<Shipment id: 4>, #<Shipment id: 5>]
Run Code Online (Sandbox Code Playgroud)

带有货件ID的发票数组

i = Invoice.find(:all, :select => "id, shipment_id")

[#<Invoice id: 98, shipment_id: 2>, #<Invoice id: 99, shipment_id: 3>]
Run Code Online (Sandbox Code Playgroud)
  • 发票属于Shipment.
  • 装运有一个发票.
  • 因此,发票表有一列shipment_id.

要创建发票,我点击新发票,然后有一个包含发货的选择菜单,所以我可以选择"我为哪个发货创建发票".所以我只想显示尚未为其创建发票的货件清单.

所以我需要一组没有发票的货件.在上面的例子中,答案是1,4,5.

ruby arrays ruby-on-rails

48
推荐指数
7
解决办法
4万
查看次数

比较两个忽略Ruby中元素顺序的数组

我需要检查两个数组是否包含任何顺序的相同数据.使用虚构的compare方法,我想做:

arr1 = [1,2,3,5,4]
arr2 = [3,4,2,1,5]
arr3 = [3,4,2,1,5,5]

arr1.compare(arr2) #true    
arr1.compare(arr3) #false
Run Code Online (Sandbox Code Playgroud)

我用过arr1.sort == arr2.sort,似乎有用,但是有更好的方法吗?

ruby arrays comparison

48
推荐指数
4
解决办法
7万
查看次数