在Rails中,label_tag和checkbox_tag存在问题。

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>

你的输出结果与你使用 check_box_tag 的方式完全不符:/ 看起来与文档中的描述也不一致 http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag - raidfive
我自己也很困惑 -_- - corroded
哦,等等,我想我粘贴了错误的东西...让我编辑一下。 - corroded
第一个参数是id和名称,第二个参数是值,第三个参数是它是否被选中(true/false),第四个参数是选项。我不确定为什么你把test_case.id作为第三个参数,而且你的id/名称值为什么不匹配有点让人困惑。 - raidfive
这是可能的吗?这就是我想要发生的事情,因为label for取决于id。但是我希望name是一个数组,这样后端就可以得到一组test_cases。 - corroded
3个回答

8
我能够按照以下方式匹配复选框和标签:
在复选框中: 我使用了check_box_tag,将具体项目名称(此处为role)指定为数组的索引以生成带有值的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请求发送到控制器时,params参数将包含以下字段:
"user"=>{ ..., "roles"=>["ROLE1", "ROLE2", "ROLE3"], ... }

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

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

check_box_tag "test_case_id[#{test_case.id}]", "#{test_case.id}", test_case.id, :name => "test_case_id[]"

3

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

如果您想要显式地命名idname不同,您需要像这样设置它们。

check_box_tag "test_case[#{test_case.id}]", test_case.is_checked?, test_case.is_checked?, :name => 'bla', :id => 'other_bla'

虽然我关心表单字段名称,但我需要ID不要有那个数组的东西,这样我就可以自己做标签。你知道他们如何实现吗?(我知道formtastic) - corroded
我尝试回答了一下,但需要更多信息。不确定你所说的“doing the labels yourself”是什么意思。使用Formtastic,你可以轻松地覆盖标签的值。如果你需要对生成的HTML有更多控制,可以尝试Simple Form这个库。但在某些情况下,你也需要能够手动完成所有操作。 - nathanvda
实际上,这段代码是由我的同事完成的,他需要从参数中获取一个测试用例数组,因此id为test_case [],值为71、72等。如果您提交表单,您将得到test_cases [] => {71, 72}。我只希望标签也能以这种方式工作,但复选框id会破坏它,因为所有复选框都必须具有test_case[]的id。这解释清楚了我的计划吗? - corroded

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接