如何确保最初根据活动记录对象属性检查rails f.check_box(而不是check_box_tag)?

时间:2010-11-10 00:52:50

标签: ruby-on-rails

对此有点兴奋;我确信我只是没有得到一些完全明显的东西,因为我无法想象这是故意的这种困难。其他所有内容都以我的形式工作,但在初始显示时,复选框不会被检查。这是相关的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 个答案:

答案 0 :(得分:4)

这种形式存在一些问题。

首先,为什么不使用rails来为你做迭代?其次,html id不能以数字开头。这种方法应该正确填充值,因为您正在使用表单构建器而不是手动插入值。

<%= 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 %>

答案 1 :(得分:2)

check_box表单助手需要多个参数。您需要传入“checked_value”的值。

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

这样的东西
<%= c.check_box :is_active, {}, @object.is_active %>

或者,您可以更新“form_for”以引用具有值而不是类名的对象。

答案 2 :(得分:0)

有时候更容易放到标签帮助器上,并且作弊一点(最后一个参数是'检查'):

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

这有用吗?

答案 3 :(得分:0)

以下是 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在这里:check_box(:post, :title),然后是 @post.title
@checked_value 是check_box的checked_value参数的值(默认情况下为'1')。

答案 4 :(得分:0)

我为此苦苦挣扎,但发现我过于复杂。如果您使用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