6

我正在寻找一种方法来编辑/添加与文章相关的关键字,在 Activeadmin 中内联。

我定义了一个简单的多对多设置:

class Area < ActiveRecord::Base
  has_many :area_keywords
  has_many :keywords, :through => :area_keywords
  accepts_nested_attributes_for :keywords, :reject_if => :all_blank, :allow_destroy => true
end

class AreaKeyword < ActiveRecord::Base
  belongs_to :area
  belongs_to :keyword
end

class Keyword < ActiveRecord::Base
  has_many :area_keywords
  has_many :areas, :through => :area_keywords
end

我想以 en Area 形式添加和编辑关键字,所以我在 Aciveadmin 中进行了设置:

ActiveAdmin.register Area do
  form do |f|
    f.inputs "Area details" do
      f.input :title
      f.input :description
    end
    f.has_many :keywords do |k|
      if k.object.nil?
        k.input :word, :label => 'Keyword'
      else
        k.input :word, :label => k.object.word
        k.input :_destroy, :as => :boolean, :label => "delete"
      end
    end
  end
end

这按预期工作。

但是,如果我将相同的关键字添加到两个不同的区域,则该关键字只会被创建两次。

输入新关键字时(在“区域”表单中),我希望它自动创建与现有关键字的关系,或者创建一个新关键字,如果它不存在。最好的方法是什么?

4

1 回答 1

4

这是一个很晚的答案 :) 但我实际上在我的一个项目中遇到了类似的问题......我必须将关键字/标签添加到两个不同的模型,但他们可以共享它们。起初我和你一样,每次你将关键字/标签“附加”到模型时,它都会创建一条记录。

处理它的更好方法是使用标记系统。我通过结合两个非常好的宝石实现了一个非常简洁的系统:'acts-as-taggable-on'https://github.com/mbleigh/acts-as-taggable-on)和'select2-rails'https ://github.com/argerim/select2-rails )

在我自己的项目中,我实际上做了与您类似的事情,并创建了一个模型,只是为了列出我想要的所有合适的关键字。但是“act-as-taggable-on”并不一定需要接受的关键字列表……因此您可以即时创建它们,它会自动处理重复项、计数等。

'select2-rails' 只允许您拥有一个漂亮的界面来在一个字段中添加和删除关键字,而不是使用复选框、选择选项或文本输入,您必须手动使用逗号或任何分隔符分隔字符串。

如果有人需要有关我如何实现所有内容的更多详细信息,我将非常乐意提供更多代码.. 但是它们的文档都非常简单!

编辑:嗯,我觉得一些代码实际上很有用:)

在您的 Gemfile 中捆绑安装两个 gem

gem 'acts-as-taggable-on'
gem 'select2-rails'

在您的Area模型中,您可以添加以下内容并执行类似的操作

class Area < ActiveRecord::Base
    # .. your code

    attr_accessible :area_keyword_list

    acts_as_taggable_on :area_keywords
end

在您的 ActiveAdmin 文件中

ActiveAdmin.register Area do

    form do |f|
      f.inputs do
        # .. whatever fields you have
        f.input :area_keyword_list,
          :as => :select,
          :multiple => :true,
          :collection => # here either a list of accepted keyword..or just left open,
          :input_html => { :class => "multiple-select" }
      end
    end
end

并且 JSselect2非常简单......

$(".multiple-select").select2();

瞧!

于 2014-05-13T08:51:08.573 回答