【问题标题】:Use custom id for check_box_tag in Rails在 Rails 中为 check_box_tag 使用自定义 id
【发布时间】:2011-01-22 13:26: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 的情况下引用正确的复选框,那也可以...

【问题讨论】:

  • 你应该回来接受这个问题的答案:3

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


【解决方案1】:

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

<% @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][] 返回数组。

【讨论】:

  • 一个小问题:您可以从第四行删除单词true if,因为它们后面的表达式的值是truefalse,无论如何。
【解决方案2】:

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

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

【讨论】:

  • @arivarasan 函数定义为check_box_tag(name, value = "1", checked = false, options = {}) ,所以nilchecked参数的占位符; truefalse 也可以使用,具体取决于您的偏好。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    我想我明白了……

    - 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
    

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

    【讨论】:

      【解决方案5】:

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

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

      c 来自我的数据库:

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

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

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

      【讨论】:

        【解决方案6】:

        HAML 样本

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

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

        【讨论】:

          【解决方案7】:

          雷托,

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

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

          每天都在学习...

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-11-18
            • 1970-01-01
            • 1970-01-01
            • 2012-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多