簡體   English   中英

顯示復選框,而不是在ActiveAdmin中輸入文本

[英]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每個值

非常感謝

由於以下幾個原因,它不起作用:

  1. 在AR模型中分配實例變量將無法實現所需的功能。 您應該使用self[:column_name]= valuewrite_attribute(:column_name, value) (我認為后者更能說明問題)。 為了閱讀,您可以使用self[:column_name]read_attribute方法。
  2. 當您發布帶有復選框或多個選擇的表單時,只會將選定的值發送回服務器(這是瀏覽器的工作方式)。 這意味着,如果僅選擇一天,則無論選擇哪一天,數組的值將始終為['', '1'] 在這種情況下,基本上不能使用統一值。
  3. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM