相关疑难解决方法(0)

Ruby - 访问多维哈希并避免访问nil对象

可能重复:
Ruby:IF语句中的Nils
是否有一种干净的方法可以避免在嵌套的params哈希中调用nil上的方法?

假设我尝试访问这样的哈希:

my_hash['key1']['key2']['key3']
Run Code Online (Sandbox Code Playgroud)

如果key1中存在key1,key2和key3,这很好,但是如果,例如key1不存在呢?

然后我会得到NoMethodError: undefined method [] for nil:NilClass.没有人喜欢这样.

到目前为止,我处理这个有条件的事情:

if my_hash['key1'] && my_hash['key1']['key2'] ...

这是否合适,还有其​​他Rubiest方式吗?

ruby hash conditional

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

Ruby在调用方法之前检查是否为nil

我在Ruby中有一个字符串,我正在调用strip方法来删除前导和尾随空格.例如

s = "12345 "
s.strip
Run Code Online (Sandbox Code Playgroud)

但是,如果字符串为空,我会收到以下错误.

NoMethodError:nil的未定义方法`strip':NilClass

我正在使用Ruby 1.9,那么在调用strip方法之前,最简单的方法是检查值是否为nil?

更新:

我在数组中的元素上尝试了这个但是遇到了同样的问题:

data[2][1][6].nil? ? data[2][1][6] : data[2][1][6].split(":")[1].strip
Run Code Online (Sandbox Code Playgroud)

ruby null

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

如何避免NoMethodError在嵌套哈希中缺少元素,而不重复nil检查?

我正在寻找一种避免nil在深层嵌套哈希中检查每个级别的好方法.例如:

name = params[:company][:owner][:name] if params[:company] && params[:company][:owner] && params[:company][:owner][:name]
Run Code Online (Sandbox Code Playgroud)

这需要三次检查,并且会产生非常难看的代码.有办法解决这个问题吗?

ruby hash ruby-on-rails hash-of-hashes

28
推荐指数
3
解决办法
3547
查看次数

如何检查params [:some] [:field]是否为零?

我尝试了很多人的代码 - 如何测试rails中是否存在参数,但它不起作用():

     if ( params.has_key?([:start_date]) && params.has_key?([:end_date]) )
Run Code Online (Sandbox Code Playgroud)

我想,那是因为复杂的参数,如果我写这个:

       if ( params.has_key?([:report][:start_date]) && params.has_key?([:report][:end_date]) )
Run Code Online (Sandbox Code Playgroud)

给我错误

        can't convert Symbol into Integer
Run Code Online (Sandbox Code Playgroud)

这也行不通:

           if ( params[:report][:start_date] && params[:report][:end_date] )
Run Code Online (Sandbox Code Playgroud)

给我错误:

        undefined method `[]' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

它总是进入其他声明.

这是我的参数:

    report: 
    start_date: 01/08/2012
    end_date: 10/08/2012
Run Code Online (Sandbox Code Playgroud)

有人能帮我吗 ?

null ruby-on-rails params

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

Ruby:Nils在IF语句中

我正在使用的rails应用程序中有以下非常难看的ruby代码:

if params.present?
  if params[:search].present?
    if params[:search][:tags_name_in].present?
      ...
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

所有我想问的是是否已经定义了params [:search] [:tags_name_in],但因为params,params [:search]和params [:search] [:tags_name_in]可能都是零,如果我使用...

if params[:search][:tags_name_in].present?
Run Code Online (Sandbox Code Playgroud)

...如果没有参数或没有搜索参数,我会收到错误.

肯定有一个更好的方法来做到这一点......建议?

ruby hash null if-statement ruby-on-rails

9
推荐指数
2
解决办法
1802
查看次数

优雅地处理嵌套哈希中的空白值

我相信我以前见过这个优雅的解决方案,但我找不到它:

我有一个rails控制器,可能或者可能没有以下hash元素:

myhash[:parent_field]
Run Code Online (Sandbox Code Playgroud)

在该父字段内,子元素也可以为空.我目前通过(非常丑陋的)方法检查:

if (!myhash[:parent_field] || !myhash[:parent_field][:child_field] || myhash[:parent_field][:child_field].blank?)
Run Code Online (Sandbox Code Playgroud)

哪个有效,但我认为 - 当然 - 必须有一个更优雅的方式.只是重申:

  • myhash [:parent_field]可能存在也可能不存在
  • 如果确实存在,myhash [:parent_field] [:child_field]可能存在也可能不存在
  • 如果存在,则可能是空白,也可能不是空白.

ruby ruby-on-rails

6
推荐指数
1
解决办法
2585
查看次数

是否定义了嵌套哈希?()

什么是最简洁的方法来确定是否@hash[:key1][:key2]已定义,如果@hash@hash[:key1]为零,则不会抛出错误?

defined?(@hash[:key1][:key2])如果@hash[:key1]存在则返回True (它不确定是否:key2已定义)

ruby hash defined hash-of-hashes

3
推荐指数
1
解决办法
4596
查看次数

Ruby如何在对象不为nil时调用方法

我正在写一个简单的脚本,从debian网站获取一些软件包的细节.在处理没有与之关联的版本的虚拟包时遇到问题.

我收到以下错误消息

undefined method `first' for nil:NilClass (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

罪魁祸首是

version = doc.css('#content h1').text.strip.scan( /\(([^>]*)\)/).last.first
Run Code Online (Sandbox Code Playgroud)

我试着将它放入if这样的条件,但这不起作用.

if doc.css('#content h1').text 
         version = doc.css('#content h1').text.strip.scan( /\(([^>]*)\)/).last.first
      end
Run Code Online (Sandbox Code Playgroud)

所以我想知道如何检查对象是否为nil,然后尝试从中提取子字符串.

这是包含except块的整个脚本

require 'rubygems'
require 'nokogiri'
require 'open-uri'


# additional code to make sure that we can resume after a break seamlessly
last_package = 0
File.open('lastbreak','r') { |fptr| last_package = fptr.gets.to_i }
puts "Resuming from package:#{last_package}" if last_package != 0

# to read each package from packageslist.txt and fetch the required info
# also to store …
Run Code Online (Sandbox Code Playgroud)

ruby methods null undefined

2
推荐指数
2
解决办法
3781
查看次数