9

我希望我的复选框可用,所以我通常会在复选框中添加标签,这样您就可以选择文本,而不必“瞄准”复选框。

问题是,如果我在 Rails 中使用嵌套属性表单怎么办?我现在有这个代码:

%ul
  - test_category.test_cases.each do |test_case|
    %li
      = check_box_tag "job_test_cases[]", "#{test_case.id}", test_case.id
      = label_tag "test_case_#{test_case.id}", test_case.name

问题在于它产生了这个:

<li>
  <input type="checkbox" value="70" name="job_test_cases[]" id="job_test_cases_" checked="checked">
  <label for="test_case_70">Blah blah</label>
</li>

而我希望它是这样的:

<li>
  <input type="checkbox" value="70" name="test_case_id[]" id="test_case_70" checked="checked">
  <label for="test_case_70">Blah BLah blah/label>
</li>
4

3 回答 3

8

我能够将复选框与标签匹配,如下所示:

在复选框中:我使用了 check_box_tag,将特定的项目名称(此处的角色)指定为数组的索引,以生成其中包含值的 id。我通过 :name 哈希值来覆盖 check_box_tag 中指定的名称,使其没有 id:

check_box_tag "user[roles][#{role.to_s}]", role.to_s, @user.has_role?(role), :name => "user[roles][]"

生成以下 HTML:

<input id="user_roles_ROLE1" name="user[roles][]" type="checkbox" value="ROLE1" />

在标签中,我使用数组名称 + '_' 加上项目名称(此处为角色)指定了 id,以正确指向标签中的 id:

label_tag "user_roles_#{role}", cur_role.role_name, :class => 'span_after_label'

生成以下 HTML:

<label class="span_after_label" for="user_roles_ROLE1">User</label>

当 PUT 发送到控制器时,参数具有以下字段:

"user"=>{ ..., "roles"=>["ROLE1", "ROLE2", "ROLE3"], ... }

这是所有选中角色的角色名称。

因此,对于您的代码,我会尝试以下操作:

check_box_tag "test_case_id[#{test_case.id}]", "#{test_case.id}", test_case.id, :name => "test_case_id[]"
于 2011-12-03T00:19:43.043 回答
3

这对我很有用:

= f.label :remember_me do
    = f.check_box :remember_me
    Remember me

无需关闭“do”块。由于缩进,它会自动关闭。查看 Rails API 的最后一个示例:http: //api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-label

于 2013-03-22T14:55:31.620 回答
0

在进行嵌套表单时,您需要fields_for确保字段名称正确(而不是each)。

我建议看一下formtasticcocoon:这将大大简化嵌套表单。

[编辑:自己做]

我不确定我是否可以更正您的代码,因为您做了一些奇怪的错误:我不明白您想要检查哪个值?你不发送它。它不可能是 id。所以通常你会写这样的东西:更正你的代码就是:

check_box_tag "test_case[#{test_case.id}]", test_case.is_checked?

该字段is_checked?返回某种布尔值。我认为如果你能提供更多关于你正在尝试做的事情的信息会有所帮助。

那会产生类似的东西

<input type="checkbox" value="true" name="test_case[70]" id="test_case_70" checked="checked">

给定is_checked?会返回true

如果要显式命名id并以name不同方式命名,则需要显式设置,如下所示

check_box_tag "test_case[#{test_case.id}]", test_case.is_checked?, test_case.is_checked?, :name => 'bla', :id => 'other_bla'
于 2011-02-18T07:14:20.393 回答