Как я могу сделать флажок по умолчанию "установленным" в Rails 1.2.3?

Как сделать так, чтобы флажок по умолчанию был «установлен», когда он изначально отображается?

Я не нашел "Rails" способа сделать это (который работает), поэтому я сделал это с помощью JavaScript. Есть ли правильный способ сделать это в Rails? Я использую Rails 1.2.3.

Ответов (7)

Решение

Если вы используете check_box в контексте формы, тогда флажок покажет то значение, которое имеет это поле.

@user = Person.find(:first)
@user.active = true
check_box 'user', 'active'  #=> will be checked by default

Если вы используете check_box_tag, третий параметр - это начальное состояние ( check_box_tagdoc ):

check_box_tag "active", 1, true

Рельсы 3.x

= form_for(@user) do |f|
  = f.check_box :subscribe, {checked: true, ...}

Это устанавливает для установленного состояния значение true и должно работать нормально. Обратите внимание на синтаксис хэша ruby ​​1.9.x, для ruby ​​1.8.x используйте формат хэш-тега {: checked => true, ...}

Я так и сделал.

Добавить скрытое поле со значением 0 ВЫШЕ check_box_tag

<%= hidden_field_tag :subscribe, '0' %>
<%= check_box_tag :subscribe, '1', params[:subscribe] != '0' %>

На сервере проверьте с помощью != '0'

subscribe = params[:subscribe] != '0'

Я был шокирован тем, что ни один из ответов не решает проблему на 100%.
Поскольку все предлагаемые решения дадут checked результат в форме редактирования, даже если пользователь снял флажок.

<%= f.check_box :subscribe, checked: @event.new_record? || f.object.subscribe? %>

Работает на рельсах 4+, ниже не тестировалось.

Простой

<%= f.check_box :subscribe, checked: "checked" %>

В новом действии вашего контроллера попробуйте:

@user = User.new(:male => true)

Где: male - это атрибут, который вы хотите проверять по умолчанию на /users/new страницах. Это передаст :male атрибут представлению со значением true, в результате чего будет установлен флажок.

Это работает на Rails 2.3.x и Rails 3.0.x!

Для нового действия в контроллере этот флажок установлен в значение true.

# in the controller
def new
  @user = Person.find(:first)
  @user.active = true
end

В форме: флажок устанавливается при создании (вызовом new), но если проверка не выполняется, флажок остается установленным со значением, которое пользователь опубликовал.

# in the view
<%= form_for ..... |f| %>
  ...
  <%= f.check_box :active %>
  ...
<% end %>

Другой способ, но не очень хороший (если вы хотите изменить логику, вам нужно выполнить новую миграцию), - это установить : default => 1 в миграции данной модели и атрибута.

class CreatePeople < ActiveRecord::Migration
  def self.up
    create_table :people do |t|
      ...
      t.boolean    :active,             :null => false,
                                        :default => 1
      t.timestamps
    end
  end

  def self.down
    drop_table :people
  end
end