如何默认collection_check_boxes来检查?

时间:2015-08-01 20:40:57

标签: ruby-on-rails ruby checked

我有这一行,我试图默认选中<%= f.collection_check_boxes :committed, checked, Date::ABBR_DAYNAMES, :downcase, :to_s, %>

db t.text "committed"

我尝试了checked&amp;的变体。 true,但也许我忽视了一些事情。

这是 Gist

2 个答案:

答案 0 :(得分:5)

您使用的是form_for,因此f是表单构建器。这意味着它被绑定到您初始化它的对象,让我们称之为@habit。由于您在表单构建器上调用collection_check_boxes,因此它会执行@habit.send(:commit)之类的操作,以查看是否应选中复选框,并且当前(显然)不是。换句话说,如果你想使用form_for,你需要这个&#34;一切都被检查&#34;事实上代表了模型本身。

现在我不确定你的模型层是什么样的,所以我将解决几个场景。如果你有这样的has_and_belongs_to_many关系:

class Habit < ActiveRecord::Base
  has_and_belongs_to_many :committed_days
end

class CommittedDay < ActiveRecord::Base
  has_and_belongs_to_many :habits
  # let's assume it has the columns :id and :name
  # also, let's assume the n:m table committed_days_habits exists
end

然后我认为最简单的方法是在控制器本身做这样的事情:

def new
  @habit = Habit.new
  @habit.committed_day_ids = CommittedDay.all.map(&:id)
end

在您的再培训局中:

<%= f.collection_check_boxes(:committed_day_ids, CommittedDay.all, :id, :name)

现在,使用has-and-belongs-to-many执行此操作可能有点过头了,尤其是周日(这意味着CommittedDay表有7条记录,每天一条记录,这有点尴尬) 。因此,您还可以考虑将数周的数组序列化到数据库中,然后确保该列的默认值包含所有数据。

ERB将与您所写的类似:

<%= f.collection_check_boxes :committed, Date::ABBR_DAYNAMES, :downcase, :to_s %>

如果你正在使用Postgres,你的课程可以简单地说:

class Habit < ActiveRecord::Base
end

序列化代码将在迁移中:

# downcase is used since in the ERB you are using :downcase for the id method
t.text :committed, default: Date::ABBR_DAYNAMES.map(&:downcase), array: true

如果您不使用Postgres,则可以使用与DB无关的Rails序列化:

class Habit < ActiveRecord::Base
  serialize :committed, Array
end

然后您的迁移将如下所示:

t.text :committed, default: Date::ABBR_DAYNAMES.map(&:downcase).to_yaml

答案 1 :(得分:5)

以下是关于如何将checked作为默认值添加到collection_check_boxes表单助手的快速答案,因为我花了一些时间来弄清楚它。将其分成一个块,您可以设置已检查并添加类。有关详情,请访问http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-collection_check_boxes

<%= f.collection_check_boxes(:author_ids, Author.all, :id, :name) do |b| %>
  <%= b.label(class: "check_box") { b.check_box(checked: true, class: "add_margin") + b.text } %>
<% end %>