19

在 Rails 中使用 check_box_tag 助手时如何设置自定义 ID?

我有一个循环,它根据集合创建一堆复选框:

- subject.syllabus_references.each do |sr|
      = check_box_tag 'question[syllabus_reference]', sr.id, :id => sr.id
      = label_tag sr.id, sr.name

我想设置一个自定义 id,以便我的复选框标签正常工作,但我似乎无法弄清楚(:id => sr.id 不起作用......)。

问题也可能与我定义标签的方式有关,所以如果我可以在不设置自定义 ID 的情况下引用正确的复选框,那么这也很好......

4

7 回答 7

22

我在我的应用程序中使用它从集合中创建复选框标签并提交它们的数组:

<% @cursos.each do |c| %>
  <span class='select_curso'>
    <%= check_box_tag "vaga[curso_ids][]",
      c.id, (checked = true if form.object.curso_ids.include?(c.id)) %>
    <%= label_tag "vaga[curso_ids][][#{c.id}]", c.nome %>
  </span>
<% end %>

所以在参数中,我有一个数组"curso_ids"=>["1", "3", "5"]而不是字符串"curso_ids"=>"5"。如果要返回单个值,请使用vaga[curso_id],否则使用vaga[curso_ids][]返回数组。

于 2010-03-02T12:50:23.760 回答
21

如果您给复选框一个额外的参数,它将起作用:

= check_box_tag 'question[syllabus_reference]', 1, nil, :id => sr.id
于 2013-06-05T16:43:51.363 回答
11

@Ganesh,在您的解决方案中,生成的 params 哈希具有以下形式:

params[:question][:syllabus_reference] = {1 => 1, 2 => 2, 3 => 3, ...}

这些应该更适合您:

check_box_tag "question[syllabus_reference][]", sr.id, checked, {:id => "question_syllabus_reference_#{sr.id}"

请注意,此功能需要第三个参数(选中)。生成的参数数组将是

params[:question][:syllabus_reference] = {1, 2, 3, ...}
于 2011-06-01T19:08:15.140 回答
3

想我想通了...

- subject.syllabus_references.each do |sr|
  = check_box_tag "question[syllabus_reference][#{sr.id}]", sr.id
  = label_tag "question[syllabus_reference][#{sr.id}]", sr.name

这行得通,但是如果您有更好的方法,请告诉我!

于 2010-03-02T02:31:17.300 回答
1

这非常有帮助,结束了我长达数天的搜索。到目前为止,我发现的大部分内容都包含语法和额外参数,它们要么被标记,要么被完全忽略。我要做的就是将一个数组从我的视图传递给我的控制器,并使用复选框告诉控制器要处理哪些数组元素。我能够进一步减少上述内容,以:

<%= check_box_tag "c[]", c.id %>

其中 c 来自我的数据库:

<%= @objects.each do |c| %>

当然,这会将一组对象 ID 传递给我的控制器,仅与已检查的条目有关(默认情况下,条目未选中,因为我省略了:false参数,顺便说一下,它产生与:true相同的结果),这几乎是所有我需要。

现在我只需要传入一个对象类型指示符——即使只是一个文字字符串也会很好——这样控制器就知道要处理什么类型的对象,而不必用额外的列来扩充我的模型。我现在将开始并发布我的解决方案,但如果您已经知道,请告诉我是否有快速简便的方法来做到这一点。

于 2012-01-28T00:09:07.643 回答
1

HAML 样本

假设您在print某处有一个带有framed属性的对象,您必须在循环内显示一个列表,prints您将创建一个自定义row并且column每个都有唯一的 idcheckbox用于更新framed

.input.row.collapse
  = check_box_tag :framed, print.framed, nil, { id: "framed_#{print.id}" }
于 2018-07-09T21:21:37.947 回答
0

莱托,

只是为了结束循环,我放弃了尝试通过check_box_tag传递对象类型指示符。我添加到上面上一篇文章中显示的语法中的每个参数(如下??)只是导致复选框状态默认为已选中而不是未选中,而无需将任何其他数据传递给控制器​​。

在对出现的替代解决方案保持警惕的同时,我暂时将对象类型合并到submit_tag值中。这将功能与显示联系起来,因为submit_tag值是在提交按钮上显示给用户的内容,但可以说这会强制视图清晰,即使它为控制器提供了所需的消歧。

天天学习...

于 2012-01-28T03:33:15.323 回答