Как гарантировать, что рельсы f.check_box (не check_box_tag) изначально проверяются на основе атрибута объекта активной записи? - PullRequest
4 голосов
/ 10 ноября 2010

чертовски много времени с этим;Я убежден, что просто не понимаю чего-то совершенно очевидного, потому что не могу представить, что это намеренно сложно.Все остальное работает в моей форме, но при первоначальном отображении флажки не проверяются, когда они должны быть.Вот соответствующий erb:

<%= form_for :project, :url=>{:controller=>'projects', :action=>'update_permissions', :id=>@project.id} do |f| %>
<fieldset>
  <% @project.contributors.each do |contributor| %>
  <%= f.fields_for "contributors[#{contributor.id}]" do |c| %>
  <ul id="PermissionsList" class="permissions-grid in-line clearfix full">
  <li>

   <ul class = "clearfix permission-row">
    <li class="first">
     <%= c.check_box :is_active %><label for="<%= contributor.id %>"><%= contributor.user.whole_name %></label>

    </li>
    <% @roles.each do |role| %>
     <li><%= c.radio_button :role_id, role.id, :id=>"#{contributor.id}-#{role.id}" %><%= label "#{contributor.id}-#{role.id}", role.role_name %></li>
    <% end %>

   </ul>
   <% end %>
  </li>

 </ul>
 <% end %>
</fieldset>

Я передаю атрибут is_checked (для текущего участника) помощнику check_box.Это правильный способ сделать это правильно?Вот как выглядит сгенерированная разметка:

<ul class="clearfix permission-row">
    <li class="first">
     <input type="hidden" value="0" name="project[contributors[9]][is_active]"><input type="checkbox" value="1" name="project[contributors[9]][is_active]" id="project_contributors_9__is_active"><label for="9">Bill Hatch</label>

    </li>
     <li><input type="radio" value="1" name="project[contributors[9]][role_id]" id="9-1" style="display: none;"><label for="9-1_Reviewer" style="display: none;">Reviewer</label></li>
     <li><input type="radio" value="2" name="project[contributors[9]][role_id]" id="9-2" style="display: none;"><label for="9-2_Tech. Reviewer" style="display: none;">Tech. reviewer</label></li>
     <li><input type="radio" value="3" name="project[contributors[9]][role_id]" id="9-3" style="display: none;"><label for="9-3_Contributor" style="display: none;">Contributor</label></li>

   </ul>

Значение флажка равно 1, как и должно быть, поэтому я немного запутался, почему он не отображается как отмеченныйКак я уже сказал, я уверен, что мне просто не хватает чего-то очевидного;ни в коем случае это не может быть так сложно; -)

Ответы [ 5 ]

4 голосов
/ 10 ноября 2010

В этой форме есть несколько ошибок.

Прежде всего, почему бы не использовать rails для выполнения итерации за вас? Во-вторых, HTML идентификаторы не могут начинаться с цифры. Этот подход должен позаботиться о правильном заполнении значений, поскольку вы используете конструктор форм, а не вставляете значения вручную.

<%= form_for @project, :url => update_permissions_project_path(@project) do |f|
  <fieldset>

  <%= f.fields_for :contributors do |c| %>
    <ul id="PermissionsList" class="permissions-grid in-line clearfix full">
      <li>
        <ul class = "clearfix permission-row">

          <li class="first">
            <%= c.check_box :is_active %>
            <%= c.label :is_active, c.object.user.whole_name %>
          </li>

          <% @roles.each do |role| %>
            <li>
              <%= c.radio_button :role_id %>
              <%= c.label :role_id, role.role_name %>
            </li>
          <% end %>

        </ul>
      </li>
    </ul>
  <% end %>

  </fieldset>
<% end %>
2 голосов
/ 10 ноября 2010

Помощник формы check_box принимает более одного аргумента. Вам нужно передать значение для "checked_value".

http://apidock.com/rails/ActionView/Helpers/FormHelper/check_box

Что-то вроде

<%= c.check_box :is_active, {}, @object.is_active %>

Или вы можете обновить свой "form_for", чтобы он ссылался на объект, который имеет значения вместо имени класса.

0 голосов
/ 11 апреля 2015

Я боролся с этим, но обнаружил, что слишком усложняю вещи. Если вы используете check_box, просто установите значение по умолчанию true или false для этого поля в вашей базе данных. Теперь мой флажок по умолчанию установлен на флажок, но будет отражать фактическое значение, если оно установлено в моем экземпляре модели.

# For new instances, the onupdate field should default to checked
check_box :onupdate

rails g migration AddDefaultToWatchers

class AddDefaultToWatchers < ActiveRecord::Migration
  def change
    change_column :watchers, :onupdate, :boolean, :default => true
  end
end
0 голосов
/ 10 апреля 2015

Вот как Rails 4 определяет, будет ли f.check_box проверяться при инициализации:

def checked?(value)
  case value
  when TrueClass, FalseClass 
    value == !!@checked_value
  when NilClass
    false
  when String
    value == @checked_value
  else
    if value.respond_to?(:include?)
      value.include?(@checked_value)
    else
      value.to_i == @checked_value.to_i
    end
  end
end

предположим, что здесь установлен флажок: check_box(:post, :title), затем
значение равно @post.title
@ checked_value - значение аргумента checked_value check_box (по умолчанию это '1').

0 голосов
/ 10 ноября 2010

Иногда проще перейти к помощнику по тегам и немного обмануть (последний параметр 'флажок'):

<%= check_box_tag "project[contributors[#{contributor.id}]][is_active]", '1', true %>

Это работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...