在Rails中使用check_box_tag的自定义ID

时间:2010-03-02 02:06:11

标签: ruby-on-rails checkbox form-helpers

在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的情况下引用正确的复选框那么那也没关系......

7 个答案:

答案 0 :(得分:18)

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

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

所以在params中,我有一个数组“curso_ids”=&gt; [“1”,“3”,“5”] 而不是字符串“curso_ids”=&gt; “5”即可。如果要返回单个值,请使用 vaga [curso_id] ,否则使用 vaga [curso_ids] [] 返回数组。

答案 1 :(得分:17)

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

= check_box_tag 'question[syllabus_reference]', 1, nil, :id => sr.id

答案 2 :(得分: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数组将是

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

答案 3 :(得分: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

这有效,但如果你有更好的方式让我知道!

答案 4 :(得分:1)

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

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

其中c来自我的数据库:

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

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

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

答案 5 :(得分:1)

HAML样本

假设您在某个地方具有print属性的framed对象,则必须显示prints的列表,因此在循环内您将创建自定义rowcolumn在每个checkbox上具有唯一ID以更新framed

.input.row.collapse
  = check_box_tag :framed, print.framed, nil, { id: "framed_#{print.id}" }

答案 6 :(得分:0)

Leito,

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

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

日复一日地学习......