有没有办法获得nested_form字段助手元素的`id`?

时间:2015-06-23 15:06:37

标签: ruby-on-rails nested-forms

我正在尝试以嵌套形式(使用nested_form)为标签创建00:05:20 属性。有没有办法获得相应for的{​​{1}}?

HAML:

id

其他信息: 当前的模型结构类似于f.checkbox,其中包含许多= label_tag '???', "Set as On", class: primary_btn = f.check_box :is_on 字段Post

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

Images

1 个答案:

答案 0 :(得分:2)

诀窍是使用fields_for。它为您提供了“范围”表单构建器实例,该实例为嵌套字段创建输入。

= 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)
  • 如果图片可以属于许多帖子,则无效。

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

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

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

我们可以使用collection_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设置一个隐藏字段,并在用户点击复选框时更新其值。如果您不确定如何执行此操作,请创建一个新问题,因为它超出了原始问题的范围。