cor*_*ded 9 checkbox label nested-attributes ruby-on-rails-3
我希望我的复选框可用,所以我通常会在复选框中添加标签,这样您就可以选择文本而不必"瞄准"复选框.
问题是,如果我在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
Run Code Online (Sandbox Code Playgroud)
这个问题是它产生了这个:
<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>
Run Code Online (Sandbox Code Playgroud)
而我希望它是这样的:
<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>
Run Code Online (Sandbox Code Playgroud)
我能够将复选框与标签匹配,如下所示:
在复选框中:我使用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][]"
Run Code Online (Sandbox Code Playgroud)
生成以下HTML:
<input id="user_roles_ROLE1" name="user[roles][]" type="checkbox" value="ROLE1" />
Run Code Online (Sandbox Code Playgroud)
在标签中,我使用数组名称+'_'加上项目名称(此处为角色)指定了id,以正确指向标签中的id:
label_tag "user_roles_#{role}", cur_role.role_name, :class => 'span_after_label'
Run Code Online (Sandbox Code Playgroud)
生成以下HTML:
<label class="span_after_label" for="user_roles_ROLE1">User</label>
Run Code Online (Sandbox Code Playgroud)
当PUT发送到控制器时,params具有以下字段:
"user"=>{ ..., "roles"=>["ROLE1", "ROLE2", "ROLE3"], ... }
Run Code Online (Sandbox Code Playgroud)
这是所有已检查角色的角色名称.
因此,对于您的代码,我会尝试以下方法:
check_box_tag "test_case_id[#{test_case.id}]", "#{test_case.id}", test_case.id, :name => "test_case_id[]"
Run Code Online (Sandbox Code Playgroud)
在执行嵌套表单时,您需要确保fields_for字段命名正确(而不是each)。
我建议看看formattastic和cocoon:这将大大简化嵌套表单的操作。
[编辑:自己做]
我不确定我可以纠正你的代码,因为你做了一些奇怪的错误:我不明白你想要检查哪个值?你不发送它。它不可能是 id。所以通常你会写这样的内容: 更正你的代码就是:
check_box_tag "test_case[#{test_case.id}]", test_case.is_checked?
Run Code Online (Sandbox Code Playgroud)
其中该字段is_checked?返回某种布尔值。我认为如果您能提供更多有关您正在尝试做的事情的信息,将会有所帮助。
这会产生类似的东西
<input type="checkbox" value="true" name="test_case[70]" id="test_case_70" checked="checked">
Run Code Online (Sandbox Code Playgroud)
给予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'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10125 次 |
| 最近记录: |