6

Ich bin auf der Suche nach einer Möglichkeit zum Bearbeiten/Hinzufügen von Stichwörtern zu einem Artikel, in ActiveAdmin inline.Bearbeiten von Viele-zu-viele-Beziehungen in ActiveAdmin

I definiert haben eine einfache many-to-many-Setup:

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 

Ich würde die Schlüsselwörter in en Gebiet Form hinzufügen, und zu bearbeiten, so dass diese I-Setup in 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 

Dies funktioniert wie erwartet.

Aber wenn ich das gleiche Schlüsselwort zu zwei verschiedenen Bereichen hinzufügen, wird das Schlüsselwort nur zweimal erstellt.

Wenn ich ein neues Schlüsselwort (im Bereich Formular) eingeben möchte, möchte ich automatisch eine Beziehung zu einem vorhandenen Schlüsselwort erstellen oder ein neues Schlüsselwort erstellen, falls es nicht existiert. Was wäre der beste Weg, um darüber zu gehen?

Antwort

4

Dies ist eine ziemlich spät Antwort :) aber ich habe tatsächlich Art von einem ähnlichen Problem in einem meiner Projekte begegnet ... Ich hatte Schlüsselwörter/Tags auf zwei verschiedene Modelle an, aber sie konnten sie teilen. Zuerst habe ich genau wie du, und es war ein Rekord für jedes Mal, wenn Sie ein Keyword/Tag an ein Modell "anhängen".

Ein besserer Weg, damit umzugehen, ist ein Tagging-System zu verwenden. Und ich erreicht eine recht ordentlich System durch zwei wirklich gute Edelsteine ​​kombinieren: 'Akte-as-markierbare-on' (https://github.com/mbleigh/acts-as-taggable-on) und 'select2-Schienen' (https://github.com/argerim/select2-rails)

In meinem eigenen Projekt, habe ich eigentlich habe etwas Ähnliches gemacht und ein Modell erstellt, um eine Liste mit allen passenden Keywords zu erhalten. Aber "act-as-taggable-on" benötigt keine Liste von akzeptierten Schlüsselwörtern ... damit Sie sie spontan erstellen können und automatisch mit Duplikaten, Zählern usw. umgehen.

'select2-rails "ermöglicht Ihnen nur eine nette Oberfläche zum Hinzufügen und Entfernen von Stichwörtern in einem Feld, anstatt Kontrollkästchen zu verwenden, Optionen auszuwählen oder eine Texteingabe, bei der Sie die Zeichenfolge manuell mit Kommas oder anderen Trennzeichen trennen müssten.

Wenn jemand mehr Details darüber benötigt, wie ich alles implementiert habe, wäre ich mehr als froh, mehr Code zur Verfügung zu stellen .. aber die Dokumentation für beide ist ziemlich einfach!

EDIT: Nun, ich habe ein etwas Code Gefühl tatsächlich wäre nützlich :)

Bundle sowohl Juwel in Ihrem Gemfile installieren

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

In Ihrem Area Modell, können Sie den folgenden hinzufügen und tun so etwas wie

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

    attr_accessible :area_keyword_list 

    acts_as_taggable_on :area_keywords 
end 

Und in Ihrer ActiveAdmin Datei

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 

und die JS für select2 ist ganz einfach ...

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

Voilà!

+0

Sehr schöne Lösung.Danke für das Teilen! Ich habe beide Edelsteine ​​benutzt, nachdem ich diese Frage gepostet habe, aber es macht Sinn, sie so zusammen zu verwenden. –

+0

gute Lösung, aber ich möchte, dass einige Standardoptionen ausgewählt werden sollten. Sagen wir während der Aktualisierung, dass meine aktuellen Kinder standardmäßig ausgewählt werden sollen. Wie kann ich das mit select2 machen? –

+0

Ich habe es getan mit: selected => IDS –