【问题标题】:Ruby on Rails - using a block parameter as a method callRuby on Rails - 使用块参数作为方法调用
【发布时间】:2020-07-25 09:44:50
【问题描述】:

我在构建一个小 Ruby on Rails 时遇到问题,需要一些帮助。 我有一个包含 20 多个列的表和一个相应的 XML 文件,可以用 gem 将其解析为某种散列。每个键都将映射到一个列,每个值都将是该列中的一条数据记录。

我在已解析的 XML 文件中访问特定值的方式是:

filename["crs","inputkeyhere"]

返回值,例如“52”或其他。

我要做的是上传文件,用 gem 解析它并为每一列赋予相应的值。

我的表(或模型)被称为“属性集”,我已经知道如何访问每一列:

@attributeset = Attributeset.new    
@attributeset.attributes.keys

所以我的想法是:

  1. 遍历所有键
  2. 将每个键传递到一个名为 |a| 的块中
  3. 通过调用相应的@attributeset 来使用rails possibilty 设置属性。
  4. 将colum属性设置为对应的xml键

所以我的代码会是这样的:

@attributeset.attributes.keys.each do |a|
      @attributeset.a=filename["crs",a]
 end

但我的问题是,ruby 认为“.a”是一种方法,并且显然不会将“a”评估为块参数。 我已经阅读了 lambdas 和 procs 之类的东西,但并没有真正理解它们如何适用于我的具体情况。

来自 bash 脚本可能我的想法可能是错误的,但我认为 .a 可能会被评估。 我知道我可以使用 yield 运行该块,但这仅适用于我所知道的方法..

感谢任何帮助。 感谢并保持健康, 亚历克斯

【问题讨论】:

  • 你可以试试@attributeset.public_send("#{a}=", filename["crs",a])吗?使用public_send,您可以从传递参数的对象调用方法

标签: ruby-on-rails ruby


【解决方案1】:

感谢您的意见! 我想让它尽可能干净,而不是使用任何临时哈希来传递参数。 我找到了方法

write_attribute

可以这样使用:

  @attributeset.write_attribute(a, xmp["crs",a])

非常适合我。

【讨论】:

    【解决方案2】:

    您可以使用[]= 方法动态设置值:

    @attributeset.attribute_names.each do |attribute|
      @attributeset[attribute] = filename["crs", attribute]
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 2013-08-14
      • 2021-09-08
      相关资源
      最近更新 更多