小编Ste*_*fan的帖子

散列默认值是具有相同默认值的散列

像这样设置哈希的默认值:

hash = Hash.new { |hsh, key| hsh[key] = {} }
Run Code Online (Sandbox Code Playgroud)

将为未知密钥创建(并分配)新哈希,但将返回nil创建哈希的未知密钥:

hash[:unkown_key] #=> {}
hash[:unkown_key][:nested_unknown] #=> nil
Run Code Online (Sandbox Code Playgroud)

我可以让它适用于第二级,如下所示:

hash = Hash.new do |hsh, key|
  hsh[key] = Hash.new { |nest_hsh, nest_key| nest_hsh[nest_key] = {} }
end
Run Code Online (Sandbox Code Playgroud)

但是,它在第​​三级不起作用:

hash[:unkown_key][:nested_unknown] #=> {}
hash[:unkown_key][:nested_unknown][:third_level] #=> nil
Run Code Online (Sandbox Code Playgroud)

如何让它在任意级别工作?

hash[:unkown_key][:nested_unknown][:third_level][...][:nth_level] #=> {}
Run Code Online (Sandbox Code Playgroud)

ruby hash default-value

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

Ruby:将常量转换为字符串

我想将常量转换FOO::BAR为 string "BAR"

这与constantize所做的相反并且非常相似demodulize,除了我期望一个字符串而不是实际的 Module 引用。

我想我可以让我自己的助手来做到这一点,但我无法获得FOO::BAR.

理想情况下,我想避免使用任何 3rd 方宝石。

例子:

class FOO
  BAR = {}
end

# this works
FOO            #=> FOO
FOO.name       #=> "FOO"    

# this doesn't
FOO::BAR       #=> {} 
FOO::BAR.name  #=> NoMethodError: undefined method `name' for {}:Hash
Run Code Online (Sandbox Code Playgroud)

ruby

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

如何根据Rails中的印度编号系统分隔数字?

我使用number_with_delimiter了在 Ruby on Rails 中为发票中的数字添加逗号的方法。但数字格式造成23,324,455,而不是因为2,33,24,455那就是,印度卢比格式

<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>
Run Code Online (Sandbox Code Playgroud)

我必须生成以卢比为单位的发票,因此格式应该是xx,xx,xxx.00. 在 Rails 中可能吗?如何实现?

这可以用 JavaScript 来完成,但问题是,我使用 PDFKit gem 生成了 PDF 格式的发票,它不响应 JavaScript。我在加载文档时使用了所需的 js 代码。

$(document).ready(function(){
  $('.totalvalue').each(function(){
    value = $('.totalvalue').text();
    $('.totalvalue').html(
      (value+"").split("").reverse().join("").replace(/(\d{3})(?=\d)/g,        '$1,').split("").reverse().join("")
    )
  })
})
Run Code Online (Sandbox Code Playgroud)

javascript ruby ruby-on-rails pdfkit number-with-delimiter

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

如果变量为nil,则赋值字符串,否则附加

我正在尝试缩短此代码:

if a.nil?
  a = "foo"
else
  a << "foo"
end
Run Code Online (Sandbox Code Playgroud)

a是一个nil或一个字符串.

我已经尝试了a ||= "foo",a += "foo"但如果a是这些则不起作用nil.

ruby ruby-on-rails

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

Rails 5:如何从另一个 yaml 配置文件引用 I18n 翻译?

我有一个配置文件:

# config/meta.yml
base_meta:
  title: 'Top 10 Cats'
Run Code Online (Sandbox Code Playgroud)

它有一个相应的初始化器:

# config/meta.yml
base_meta:
  title: 'Top 10 Cats'
Run Code Online (Sandbox Code Playgroud)

我可以像这样访问标题:

# config/initializers/meta.rb
META = YAML.load_file("#{Rails.root.to_s}/config/meta.yml")
Run Code Online (Sandbox Code Playgroud)

但是,我想国际化我的元数据。我相信这应该由现有的locales/yaml 文件来处理。

如何引用现有的翻译?

# config/locales/en.yml
en:
  title: 'Top 10 Cats'
Run Code Online (Sandbox Code Playgroud)

我尝试过使用 erb,但它不起作用:

# config/meta.yml
base_meta:
  title: t(:title)
Run Code Online (Sandbox Code Playgroud)

将文件重命名为config/meta.yml.erb也没有效果。

有没有办法从我的配置文件中引用 I18n 键?

ruby ruby-on-rails rails-i18n ruby-on-rails-5

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

对数组使用.sum时没有方法错误

我找到了其他方法,但是根据ruby文档,这应该可行吗?

p [1,2,3,4].sum
#=> 10
Run Code Online (Sandbox Code Playgroud)

相反,我得到了..

undefined method `sum' for [1, 2, 3, 4]:Array (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

ruby sum nomethoderror

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

是什么阻止我在 Ruby 中包含一个类?

我试图了解一些 Ruby 的内部结构:

尝试使用include不是模块会导致TypeError:(这是设计使然的)

class C
end

class Foo
end

Foo.include(C)
#=> TypeError: wrong argument type Class (expected Module)
Run Code Online (Sandbox Code Playgroud)

我想知道类型检查“在幕后”是如何工作的。

由于类模块,我假设 Ruby 检查参数是否是以下的实际实例Module

C.is_a?(Module)        #=> true
C.instance_of?(Module) #=> false
Run Code Online (Sandbox Code Playgroud)

听起来很合理,不是吗?

但是当我定义自己的Module子类并创建该子类的实例时,它工作得很好:

class Klass < Module
end

K = Klass.new

Foo.include(K)
# no error
Run Code Online (Sandbox Code Playgroud)

K是 的一个实例Klass,就像C是 的一个实例一样Class。并且Klass是 的子类Module,就像Class

K.is_a?(Module)        #=> true
K.instance_of?(Module) #=> …
Run Code Online (Sandbox Code Playgroud)

ruby class include

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

液体 - 除非 for.loop 似乎总是最后一个

请考虑以下内容:

{% for variant in product.variants %}
    {{ forloop.index }}<br>
    {{ unless forloop.last }}LAST<br>{{ endunless }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

根据shopify文档

如果这是 for 循环的最后一次迭代,则返回 true。如果不是最后一次迭代,则返回 false。

上面代码的输出是:(对于 3 个变体)

1
LAST
2
LAST
3
LAST
Run Code Online (Sandbox Code Playgroud)

为什么?变体对象与上下文中的其他对象不同吗forloop.last

ruby liquid shopify

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

Ruby Sort_by 多个参数与 asc/desc 相反

尝试按多个参数排序,但在一个参数升序排序和另一个参数降序排序时遇到问题。

array = [20, 10, 40, 1200, 300]
Run Code Online (Sandbox Code Playgroud)

我需要首先按每个数字降序的位数对数组进行排序。

所以我们得到 [1200, 120, 40, 10, 20]

如果长度之间存在联系,我需要按值对它们进行升序排序

所以我们得到: [1200, 120, 10, 20, 40]

我正在尝试使 sort_by 为此工作,但我无法弄清楚如何对第一个参数进行降序排序和第二个参数升序排序。

def digit_sorter(ar) 
   ar.sort_by {|num| [num.to_s.length, num]}.reverse 
end
Run Code Online (Sandbox Code Playgroud)

我也试过 [ [num.to_s.length], [num].reverse ]

ruby sorting

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

如果只输入零,则从字符串中删除多个零

我正在尝试实现一种方法,如果用户输入一系列零,"00000"它应该返回"0"

否则,如果用户输入例如"00009""90000",则输入变量应保持不变。

这个问题有简单的解决方案吗?

ruby

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