在我的 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
?
感谢您的帮助。
你可以尝试这样的事情:
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 中的 select、options_for_select 以及 options_for_select 中的
注释这很好地解释了它: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
改进之前的答案,我建议将该方法移至 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
)可以避免编辑时未选择所选选项的潜在错误