我正在寻找一种方法来编辑/添加与文章相关的关键字,内联在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
我想在“区域”表单中添加和编辑关键字,因此我在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
这按预期工作.
但是如果我将相同的关键字添加到两个不同的区域,关键字将只创建两次.
输入新关键字时(在“区域”表单中),我希望它自动创建与现有关键字的关系,或者创建新关键字(如果不存在).最好的方法是什么?
解决方法
这是一个相当晚的答案:)但我实际上在我的一个项目中遇到过类似的问题……我不得不将关键字/标签添加到两个不同的模型中,但他们可以共享它们.起初我和你一样,并且每次将关键字/标签“附加”到模型时都会创建一条记录.
处理它的更好方法是使用标记系统.我通过结合两个非常好的宝石实现了一个非常整洁的系统:’act-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’只允许你有一个很好的界面来添加和删除一个字段中的关键字,而不是使用复选框,选择选项或文本输入,你必须用逗号或任何分隔符手动分隔你的字符串.
如果有人需要有关我如何实现所有内容的更多详细信息,我会非常乐意提供更多代码..但是这两个文档都非常简单!
编辑:嗯,我有一种感觉,一些代码实际上是有用的:)
Bundle在你的Gemfile中安装两个gem
gem 'acts-as-taggable-on' gem 'select2-rails'
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
而select2的JS非常简单……
$(".multiple-select").select2();
沃利亚!