[英]ActiveAdmin — Show list of checkboxes for nested form instead of a form to add items
[英]Show checkboxes instead of text input in ActiveAdmin
在模型Code
有一個名為week_days
的字段,可能類似於1100110
。 我想在ActiveAdmin表單中顯示7個復選框,而不是傳統的輸入字段
form do |f|
f.inputs do
f.input :name
f.input :week_days
end
f.actions
end
所以我想在模型中寫一個像這樣的映射器
def week_days_checkboxes
[
['sunday', 1],
['monday', 1],
['tuesday', 1],
['wednesday', 1],
['thursday', 1],
['friday', 1],
['saturday', 1]
]
end
def week_days_checkboxes=(week_days_checkboxes)
@week_days = week_days_checkboxes.reverse.join.to_i(2)
end
然后以這種方式更改表單輸入
f.input :week_days_checkboxes, as: :check_boxes
但這不起作用。 我需要做什么?
PS:每對的第二個值應為1或0,具體取決於字段week_days
每個值
非常感謝
由於以下幾個原因,它不起作用:
self[:column_name]= value
或write_attribute(:column_name, value)
(我認為后者更能說明問題)。 為了閱讀,您可以使用self[:column_name]
或read_attribute
方法。 ['', '1']
。 在這種情況下,基本上不能使用統一值。 從week_days_checkboxes
方法返回數組數組將不顯示選擇列表,因為它表示值而不是選擇。 您必須顯式設置集合。
f.input :week_days, as: :check_boxes, collection: week_days_for_select
其中week_days_for_select
返回適當的列表。
而且,當您編輯現有模型時,不會在復選框列表中選擇以前選擇的日期。 為此,您需要返回與復選框輸入值匹配的值列表。
一種解決方案可能是:
您認為:
f.input :week_days, as: :check_boxes, collection: Date::DAYNAMES
然后在您的模型中為week_days
創建一個包裝器,以便它接受列表並將其轉換為整數,反之亦然。
def week_days
return [] if read_attribute(:week_days).blank?
# first you have to convert the integer to a binary array
w = read_attribute(:week_days)
days_as_binary = Math.log2(w).floor.downto(0).map { |nth_bit| w[nth_bit] }
# alternatively
# days_as_binary = read_attribute(:week_days).to_s(2).split('').map(&:to_i)
# make sure it has an element for every day of the week
padded_binary = [0] * (7 - days_as_binary.size) + days_as_binary
# map the binary array to day names
padded_binary.each_with_index.map do |d, idx|
Date::DAYNAMES[idx] if d == 1
end.compact
end
def week_days=(values)
days = Date::DAYNAMES.map { |d| values.include?(d) ? 1 : 0 }
write_attribute(:week_days, days.join.to_i(2))
end
盡管我認為用整數表示所選日期不是您的最佳選擇。 如果使用的是PostgreSQL,則AR 4+對數組具有良好的支持-您可以將幾天的時間保存到數據庫中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.