Я настраиваю Active Admin. Все работает отдельно от таблицы соединений, которая связывает ресурс журнала с ресурсом ключевого слова. Один журнал определяется несколькими ключевыми словами, а ключевое слово может определять несколько журналов.
У меня две модели:
### models/magazine.rb
class Magazine < ActiveRecord::Base
attr_accessible :colour, :cover_alt, :description, :number, :short, :title_id
has_and_belongs_to_many :keywords, :join_table => "magazines_keywords"
belongs_to :title, :class_name => "Keyword", :foreign_key => "title_id"
end
### models/keywords.rb
class Keyword < ActiveRecord::Base
attr_accessible :word, :description
has_and_belongs_to_many :magazines, :join_table => "magazines_keywords"
end
И таблица соединения:
### models/magazines_keyword.rb
class MagazinesKeyword < ActiveRecord::Base
attr_accessible :magazine_id, :keyword_id
belongs_to :magazine
belongs_to :keyword
end
Этот параметр работает для просмотров моего приложения rails, и у меня есть раздел индекса и шоу моего ресурса журнала AA, но форма (для новых и редактирования) не работает:
ActiveAdmin.register Magazine do
menu :priority => 1
form do |f|
f.semantic_errors *f.object.errors.keys
f.inputs "Magazine Details" do
f.input :title_id, :label => 'Title', :as => :select, :collection => Keyword.all.map{ |u| ["#{u.word.capitalize}", u.id] }
f.inputs :magazines_keywords do
f.has_many : magazines_keywords do |s|
s.input :keyword, :as => :select, :multiple => true, :collection => MagazinesKeyword.all.map { |u| ["#{u.keyword.word.capitalize}", u.id] }
end
end
end
f.actions
end
show do
panel "Magazine Details" do
attributes_table_for magazine do
row "Keywords", :keyword do |m|
m.keywords.map { |d| d.word }.join(", ").html_safe
end
end
end
active_admin_comments
end
end
При запуске приложения я получаю NoMethodError in Admin/magazines#edit
Где /active_admin/resource/edit.html.arb line #1
вызывает undefined method 'klass' for nil:NilClass
Я могу отображать все ключевые слова в разделе формы с помощью:
f.input :magazines_keywords, :as => :check_boxes, :multiple => true, :collection => MagazinesKeyword.all.map{ |u| ["#{u.keyword.word.capitalize}", u.id] }
Но когда я пытаюсь написать их, это не сработает. Редактирование значений также не работает.
Где я чего-то пропущу? Как я могу заставить это работать?
****ОБНОВИТЬ****
После некоторой работы я получил следующее решение:
form do |f|
f.semantic_errors *f.object.errors.keys
f.inputs "Saft Details" do
f.input :title_id, :label => 'Title', :as => :select, :collection => Keyword.all.map{ |u| ["#{u.word.capitalize}", u.id] }
f.input :keywords, :as => :check_boxes, :input_html => {:multiple => true}
end
f.actions
end
И как было предложено:
f.input :keywords, :as => :check_boxes, :input_html => {:multiple => true} do
f.has_many :keywords do |s|
s.input :keyword, :collection => Keyword.all.map { |kw| ["#{kw.word.capitalize}", kw.id] }
end
end
В обоих решениях я могу написать новую запись в журнале и получить ассоциацию, записанную в таблицу соединений, к сожалению, она отображает #<Keyword:0x10c858858>
в форме, а не в слове. Что мне не хватает?
ActiveAdmin достаточно умный, чтобы понять, что вы пытаетесь сделать. Поэтому вы должны игнорировать MagazinesKeyword
и перейти прямо к модели Keyword
. Поэтому вы должны изменить это:
f.has_many :magazines_keywords do |s|
s.input :keyword, :as => :select, :multiple => true, :collection => MagazinesKeyword.all.map { |u| ["#{u.keyword.word.capitalize}", u.id] }
end
с этим:
f.has_many :keywords do |s|
s.input :keyword, :as => :select, :multiple => true, :collection => Keyword.all.map { |kw| ["#{kw.word.capitalize}", kw.id] }
end
Active admin будет обрабатывать MagazinesKeyword
самостоятельно.
MagazinesKeyword
не является необходимым. Я уже нашел какое-то решение, но ваше предложение намного лучше. В настоящее время я могу написать запись, но форма не отображает ключевое слово, а только#<Keyword:0x10c858858>
. Я обновлю свой вопрос соответственно.