在Rails中使用check_box_tag的自定义ID

在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的情况下引用正确的复选框,那么也可以……

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

 <% @cursos.each do |c| %>  <%= 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 %>  <% end %> 

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

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

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

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

 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, ...} 

想想我弄清楚了……

 - 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 

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

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

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

其中c来自我的数据库:

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

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

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

Leito,

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

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

日复一日学习……

HAML样本

假设你有一个带有framed属性的print对象,你必须显示一个prints列表,所以在循环内你将创建一个自定义rowcolumn ,每个checkbox上都有唯一的id用于更新framed

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