2012-12-03 16 views
6

Szukam sposobu edytowania/dodawania słów kluczowych związanych z artykułem, w linii w Activeadmin.Edycja relacji wielu do wielu w Activeadmin

Mam zdefiniowane prosty wiele-do-wielu 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 

chciałbym dodawać i edytować słowa kluczowe w formie en okolicy, więc ustawienie tego w 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 

Działa to zgodnie z oczekiwaniami.

Ale jeśli dodaję to samo słowo kluczowe do dwóch różnych obszarów, słowo kluczowe zostanie utworzone dwa razy.

Wprowadzając nowe słowo kluczowe (w formularzu Obszar), chcę automatycznie utworzyć relację z istniejącym słowem kluczowym lub utworzyć nowe słowo kluczowe, jeśli nie istnieje. Jaki byłby najlepszy sposób, aby to osiągnąć?

Odpowiedz

4

To dość późna odpowiedź :) ale faktycznie spotkałem się z podobnym problemem w jednym z moich projektów ... Musiałem dodać słowa kluczowe/tagi do dwóch różnych modeli, ale mogli je udostępnić. Z początku tak jak ja, i to było tworzenie rekordu za każdym razem, gdy "dołączasz" słowo/tag do modelu.

Lepszym sposobem na pokonanie tego problemu jest użycie systemu oznaczania. I osiągnąć system całkiem zgrabny łącząc dwie naprawdę dobre perełki: 'akty-as-taggable na' (https://github.com/mbleigh/acts-as-taggable-on) i 'wybierz 2-szyny' (https://github.com/argerim/select2-rails)

W moim projekcie, tak naprawdę zrobiłeś coś podobnego do ciebie i stworzyłeś model, żeby mieć listę wszystkich odpowiednich słów kluczowych, które chciałem. Ale "akt-as-taggable-on" nie musi koniecznie zawierać listy zaakceptowanych słów kluczowych ... dzięki czemu można je tworzyć w locie, a to automatycznie obsługuje duplikaty, liczy itp.

'select2-rails "Po prostu pozwala mieć ładny interfejs do dodawania i usuwania słów kluczowych w jednym polu, zamiast używać pól wyboru, wybierać opcje lub wprowadzać tekst, w którym trzeba ręcznie rozdzielić ciąg znaków przecinkami lub dowolnymi separatorami.

Jeśli ktoś potrzebuje więcej szczegółów na temat tego, jak wdrożyłem wszystkie, byłbym bardziej niż zadowolony z dostarczania większej ilości kodu, ale dokumentacja dla nich obu jest całkiem prosta!

EDIT: No, mam wrażenie trochę kodu byłby rzeczywiście przydatna :)

Bundle zainstalować zarówno klejnot w Gemfile

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

W modelu Area, można dodać następujące i zrobić coś

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

    attr_accessible :area_keyword_list 

    acts_as_taggable_on :area_keywords 
end 

A w pliku 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 

i JS na select2 jest dość proste ...

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

voila!

+0

Bardzo ładne rozwiązanie.Dzięki za udostępnienie! Użyłem obu klejnotów po tym, jak napisałem to pytanie, ale dobrze jest używać ich razem w ten sposób. –

+0

dobre rozwiązanie, ale chcę, aby niektóre domyślne opcje zostały wybrane. Powiedzmy, że podczas aktualizacji chcę, aby moje obecne dzieci były domyślnie wybrane. Jak mogę to zrobić za pomocą select2. –

+0

zrobiłem to z: selected => IDS –

Powiązane problemy