【问题标题】:label_tag and checkbox_tag problem in railsrails 中的 label_tag 和 checkbox_tag 问题
【发布时间】:2011-02-15 11:13:45
【问题描述】:

我希望我的复选框可用,因此我通常会在复选框中添加标签,这样您就可以选择文本,而不必“瞄准”复选框。

问题是,如果我在 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

问题在于它会产生这个:

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

而我希望它是这样的:

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

【问题讨论】:

  • 您的输出完全不是我对您使用check_box_tag 的预期:/ 似乎与文档完全不匹配api.rubyonrails.org/classes/ActionView/Helpers/…
  • 我自己也很困惑-_-
  • 哦,等等,我想我粘贴了错误的东西..让我编辑它
  • 第一个参数是 id 和名称,第二个是值,第三个是检查的天气(真/假),第四个是选项。不知道为什么你有 test_case.id 作为第三个参数,我有点困惑为什么你的 id/name 值不匹配。
  • 这可能吗?这就是我想要发生的事情,因为标签取决于 id。但我希望名称是一个数组,以便后端获取 test_cases 的集合。

标签: ruby-on-rails-3 label checkbox nested-attributes


【解决方案1】:

我能够将复选框与标签匹配如下:

在复选框中: 我使用了 check_box_tag,将特定的项目名称(此处的角色)指定为数组的索引,以生成其中包含值的 id。我通过 :name 哈希值来覆盖 check_box_tag 中指定的名称,使其没有 id:

check_box_tag "user[roles][#{role.to_s}]", role.to_s, @user.has_role?(role), :name => "user[roles][]"

生成以下 HTML:

<input id="user_roles_ROLE1" name="user[roles][]" type="checkbox" value="ROLE1" />

在标签中,我使用数组名+'_'加上项目名称(这里是角色)指定了id,以正确指向标签中的id:

label_tag "user_roles_#{role}", cur_role.role_name, :class => 'span_after_label'

生成以下 HTML:

<label class="span_after_label" for="user_roles_ROLE1">User</label>

当 PUT 发送到控制器时,params 有以下字段:

"user"=>{ ..., "roles"=>["ROLE1", "ROLE2", "ROLE3"], ... }

这是所有选中角色的角色名称。

因此,对于您的代码,我会尝试以下操作:

check_box_tag "test_case_id[#{test_case.id}]", "#{test_case.id}", test_case.id, :name => "test_case_id[]"

【讨论】:

    【解决方案2】:

    这对我很有用:

    = f.label :remember_me do
        = f.check_box :remember_me
        Remember me
    

    无需关闭“do”块。由于缩进,它会自动关闭。 查看 Rails API 的最后一个示例: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-label

    【讨论】:

      【解决方案3】:

      在进行嵌套表单时,您需要使用fields_for 以确保您的字段名称正确(而不是each)。

      我建议看看formtasticcocoon:这将大大简化嵌套表单。

      [编辑:自己做]

      我不确定我是否可以更正您的代码,因为您做了一些奇怪的错误:我不明白您想要检查哪个值?你不发送它。它不可能是 id。所以通常你会写这样的东西: 更正您的代码就是:

      check_box_tag "test_case[#{test_case.id}]", test_case.is_checked?
      

      is_checked? 字段返回某种布尔值。我认为如果你能提供更多关于你正在尝试做的事情的信息会有所帮助。

      这会产生类似的东西

      <input type="checkbox" value="true" name="test_case[70]" id="test_case_70" checked="checked">
      

      给定is_checked? 将返回true

      如果您想以不同的方式显式命名 idname,则需要像这样显式设置

      check_box_tag "test_case[#{test_case.id}]", test_case.is_checked?, test_case.is_checked?, :name => 'bla', :id => 'other_bla'
      

      【讨论】:

      • 虽然我关心表单字段名称,但我确实需要 id 没有那个数组的东西,所以我可以自己做标签。你知道他们是如何实现的吗?(我知道formtastic)
      • 我尝试回答,但需要更多信息。不知道你的意思是:“自己做标签”。使用 formtastic,您可以轻松否决标签的值。如果对生成的 html 有更多的控制权,请查看 simple_form。但在某些情况下,您还需要能够手动完成所有操作。
      • 其实代码是由我的同事完成的,他需要从参数中获取一个 test_cases 数组,因此 id 是 test_case[] 并且值是 71、72 等,如果你提交你得到 test_cases[] => {71, 72} 的形式。我只是希望它以这种方式与标签一起工作,但是复选框 id 会破坏它,因为所有复选框都必须具有 test_case [] 的 id。这能很好地解释我的计划吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      相关资源
      最近更新 更多