如何在field_for中使用简单形式的关联

时间:2015-12-31 04:53:37

标签: ruby-on-rails polymorphic-associations

我有三个模型:User,Fruit,Tag

用户有很多水果,水果属于用户:一对多

水果有很多标签,标签有很多水果:多对多

当我创建新用户时,我会创建一个新水果并选择一个标签。

但是我发生错误Association :tags not found

我目前的代码是:

= simple_form_for(@user) do |f|
  = f.error_notification

      .form-inputs
        = f.input :name
        = f.simple_fields_for :fruits do |fl|
          = fl.error_notification
          .form-inputs
            = fl.input :name
            = fl.association :tags
      .form-actions
        = f.button :submit

user.rb

class User
  has_many :fruits
end

fruit.rb

class Fruit
  belongs_to :user
  has_many :tagging, as: :taggable
  has_many :tags, through: :tagging
end

tag.rb

class Tag
  has_many :taggings
end

tagging.rb

class Tagging
  belongs_to :tag
  belongs_to :taggable, polymorphic: true
end

2 个答案:

答案 0 :(得分:0)

simple_fields_for的工作方式与fields_for Rails助手的工作方式相同。

由于您的Fruit有很多Tags,因此您应该使用:

= fl.simple_fields_for :tags

而不是:

= fl.association :tags

因此,您的代码应如下所示:

  .form-inputs
    = f.input :name
    = f.simple_fields_for :fruits do |fl|
      = fl.error_notification
      .form-inputs
        = fl.input :name
        = fl.simple_fields_for :tags
  .form-actions
    = f.button :submit

更新

如果要从标签列表中选择标签而不是创建新标签,可以执行以下操作:

= fl.input :tags, as: :check_boxes, checked: Tag.pluck(&:id)

答案 1 :(得分:0)

= fl.collection_select :tag_ids, Tag.all, :id, :name

代替= fl.association :tags

-

参考collection_singular_ids