有没有办法获取 nested_form 字段辅助元素的“id”?

Is there a way to get the `id` of a nested_form field helper element?

我正在尝试为嵌套形式的标签创建 for 属性(使用 nested_form)。有没有办法得到相应 f.checkboxid

HAML:

= label_tag '???', "Set as On",  class: primary_btn
= f.check_box :is_on

附加信息: 当前的模型结构就像 Post 有许多 Images 字段 is_on

所以我想创建一个嵌套字段组,例如:

  <label class="primary_btn" for="post_images_attributes_0_is_on">Set as primary</label>
  <input id="post_images_attributes_0_is_on" name="post[images_attributes][0][is_on]" style="display:none;" type="checkbox" value="1">

诀窍是使用fields_for。它为您提供了一个 "scoped" 表单生成器实例,它为嵌套字段创建输入。

= form_for (:post) do |f| 
    # ... a bunch of fields
    = f.fields_for :images do |builder|
        = builder.label :is_on, "Set as primary"
        = builder.check_box :is_on

但是您的解决方案有一些真正的陷阱:

  • 每次更改主图像时,您需要更新所有 post.images 以确保只有一个图像具有 is_on 标志。
  • 你需要做primary_image = post.images.where(is_on: true)
  • 如果图片可以属于多个帖子,则无法使用。

更好的解决方案是在 Post 上创建与主图像的特殊关系。

class Post < ActiveRecord::Base
  has_many :images
  has_one :primary_image, class_name: 'Image'
end

这会将主图像存储为 posts.primary_image_id 中的整数,而不是 images 中的布尔标志。

我们可以使用collection_select获取select标签来显示主图片属性。

= form_for (@post) do |f| 
    # ... a bunch of fields
    = f.fields_for :images do |builder|
        # ...
  = f.collection_select(:primary_image, @post.images, :id, :name)

诚然,从用户体验的角度来看,这并不是最佳选择。需要 javascript 的解决方案是为 :primary_image 设置一个隐藏字段,并在用户单击复选框时更新其值。如果您不确定如何执行此操作,请创建一个新问题,因为它超出了您原始问题的范围。