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 フォームでキーワードを追加および編集したいので、これを Activeadmin でセットアップします。

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

これは期待どおりに機能します。

しかし、同じキーワードを 2 つの異なる領域に追加すると、キーワードが 2 回作成されます。

新しいキーワードを (エリア フォームに) 入力するときに、既存のキーワードとの関係を自動的に作成するか、存在しない場合は新しいキーワードを作成したいと考えています。それを行う最善の方法は何ですか?

4

1 に答える 1

4

これはかなり遅い回答です:)しかし、実際にプロジェクトの1つで同様の問題に遭遇しました...2つの異なるモデルにキーワード/タグを追加する必要がありましたが、それらは共有できました。最初はあなたと同じように、モデルにキーワード/タグを「付ける」たびにレコードを作成していました。

これを処理するより良い方法は、タグ付けシステムを使用することです。そして、'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」を使用すると、チェックボックス、選択オプション、または文字列をカンマや区切り記号で手動で区切る必要があるテキスト入力を使用するのではなく、1 つのフィールドでキーワードを追加および削除するための優れたインターフェイスを使用できます。

私がすべてをどのように実装したかについて誰かがさらに詳細を必要とする場合は、喜んでより多くのコードを提供します..しかし、両方のドキュメントは非常に簡単です!

編集:まあ、いくつかのコードが実際に役立つと感じています:)

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

JS forselect2は非常に単純です...

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

ほら!

于 2014-05-13T08:51:08.573 に答える