Активный администратор с отношением таблицы соединений

0

Я настраиваю 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
activerecord
ruby-on-rails-3

1 ответ

0
Лучший ответ

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 самостоятельно.

  • 0
    Спасибо за ваш вклад! Действительно MagazinesKeyword не является необходимым. Я уже нашел какое-то решение, но ваше предложение намного лучше. В настоящее время я могу написать запись, но форма не отображает ключевое слово, а только #<Keyword:0x10c858858> . Я обновлю свой вопрос соответственно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню