首页 > 解决方案 > Rails 迭代对一个属性使用连接方法

问题描述

当有人输入与数据库匹配的表单数据并且他们希望通过电子邮件将所有数据发送给他们时,我正在向客户发送邮件。

因此,我选择使用以下每个属性进行迭代:

h1 The customer registration form has been submitted.
-@customer.attributes.each do |k, v|
  ul
    li
      strong #{k.underscore.split('_').join(' ').titleize}:
      ' #{v}

然后它将显示如下内容:

ID: 200
First Name:Bill
Last Name:Smith
Email:no@no.com
Business Segments:["Purchasing", "Residential", "Commercial"]

如果我保持原样,邮件程序将显示电子邮件。但是,每当我尝试 #{v.join(', ')} 时,它都会失败。因此,我对其进行了测试,确定它可以正常工作,因为有整数。那么如何只对业务段的属性应用join方法呢?

我尝试了以下方法无济于事:

-@customer.attributes.each do |k, v|
 ul
   li
     strong =k.underscore.split('_').join(' ').titleize + ': '
     - if k != business_segments
      =v
     - else
      =v.join(', ')

这不会正确触发。

标签: ruby-on-rails

解决方案


我倾向于使用以下内容:

ul
  - @customer.attributes.each do |k, v|
    li
      strong = k.titleize + ': '
      = v.is_a?(Array) ? v.join(', ') : v

几点注意事项:

  • 我已经把ul循环拉到外面了,因为你很可能在一个列表之后,属性填充它

  • titleize应该足以在不进行其他修改的情况下转换测试

  • 最后一行使用三元来确定数据是数组还是其他,并按要求呈现文本

顺便说一句,Rubocop 的风格指南建议使用is_a?over kind_of?,而且我看到一些讨论建议更喜欢is_a?内置类,例如Array. 虽然没有那么多。

希望这很有用,如果您有任何问题/反馈,请告诉我:)


推荐阅读