有没有办法获取 nested_form 字段辅助元素的“id”?
Is there a way to get the `id` of a nested_form field helper element?
我正在尝试为嵌套形式的标签创建 for
属性(使用 nested_form)。有没有办法得到相应 f.checkbox
的 id
?
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
设置一个隐藏字段,并在用户单击复选框时更新其值。如果您不确定如何执行此操作,请创建一个新问题,因为它超出了您原始问题的范围。
我正在尝试为嵌套形式的标签创建 for
属性(使用 nested_form)。有没有办法得到相应 f.checkbox
的 id
?
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
设置一个隐藏字段,并在用户单击复选框时更新其值。如果您不确定如何执行此操作,请创建一个新问题,因为它超出了您原始问题的范围。