如何为我的选择框的每个选项添加数据属性?

问题描述 投票:0回答:3

在我的 Rails 应用程序中,我有这个选择框:

<%= f.select :invoice_id, current_user.invoices.numbers_ordered %>

这是我的

Invoice
课程:

class Invoice < ActiveRecord::Base

  belongs_to :user

  def self.numbers_ordered
    order(:number).map { |i| [ i.number, i.id ] }
  end

  ...

end

如何在不更改太多现有代码的情况下为每个选项添加

data-attribute

感谢您的帮助。

ruby-on-rails ruby ruby-on-rails-3 custom-data-attribute
3个回答
3
投票

你可以尝试这样的事情:

def self.numbers_ordered
  order(:number).map { |i| [ i.number, i.id, :'data-attribute' => i.some_data ] }
end

select
在内部使用
options_for_select
并获取
options_for_select
的所有参数。

请参阅 Rails API 中的 selectoptions_for_select 以及 options_for_select 中的

注释

1
投票

这很好地解释了它:https://stackoverflow.com/a/9076805/2036529

在您看来,您可以使用:

<%= f.select :invoice_id, options_for_select(current_user.invoices.numbers_ordered) %>

并在您的 Invoice 类中,将方法更改为以下:

def self.numbers_ordered
   order(:number).map { |i| [ i.number, i.id, {'data-customAttr': "#{i.attr_1} -- #{i.attr_2}" ] }
end

0
投票

改进之前的答案,我建议将该方法移至 InvoiceHelper

# app/helpers/invoices_helper.rb
module InvoicesHelper
  def options_for_invoice_select
    order(:number).map { |i| [ i.number, i.id, data: {attribute: i.some_attribute} ] }
  end
end

然后您可以简单地将这个集合发送到您的选择

<%= f.select :invoice_id, options_for_invoice_select %>

直接使用它(而不是调用

options_for_select
)可以避免编辑时未选择所选选项的潜在错误

© www.soinside.com 2019 - 2024. All rights reserved.