Rails 3 - ActiveAdmin - Отображение объекта ActiveRecord вместо текста

В настоящее время у меня есть приложение Rails 3.0.10, и я создал две модели с простыми ассоциациями: has_many и own_to.

После установки плагина ActiveAdmin и создания соответствующих файлов ресурсов Ruby я заметил странное поведение.

Ниже вы можете видеть, что «Файл задания» принадлежит «Клиентам Ernet». Все ассоциации работают правильно, однако отображаемое имя отображается как фактический объект ActiveRecord, а не как имя клиента.

введите здесь описание изображения

Это вид шоу в разделе «Файл задания»:

введите здесь описание изображения

Но если я перейду к просмотру реального клиента, появится правильный текст:

введите здесь описание изображения

Должно быть что-то не так в ресурсе «Файл задания», что вызывает это, но я не могу понять, что это может быть. Погуглив, я нашел это: http://groups.google.com/group/activeadmin/browse_thread/thread/2a261e070efa7bae

В файле JobFile.register я указал отображаемое имя следующим образом:

filter :ernet_client, :display_name_methods => :display_name

Однако это не сработало, и я безрезультатно перебирал все другие доступные имена.

Я просмотрел зависимости ActiveAdmin, и sass-rails кажется единственным, но это если вы используете 3.1, а я использую Rails 3.0.10.

И, наконец, чтобы убедиться, что мои ассоциации действительно работают, я открыл консоль Rails и создал файл задания:

job = JobFile.new
=> #<JobFile hash returned>
job.ernet_client_id = 2
=> 2
job.ernet_client.client_name
=> Target

Кажется, все работает как надо.

Кто-нибудь знает, как это решить?


person PhillipKregg    schedule 29.10.2011    source источник


Ответы (2)


Вы пытались определить метод to_s для модели ErnetClient?

def to_s
  display_name
end

Похоже, что этот метод вызывается автоматически, как если бы вы вызвали to_s для одного из этих объектов в консоли, вы получили бы аналогичный результат.

person Ryan Bigg    schedule 29.10.2011
comment
Хорошо, я определил метод to_s в модели ErnetClient.rb, как вы предложили. Это приводит к ошибке в файле active_admin/resource/index.html.arb: неопределенная локальная переменная или метод display_name для #‹ErnetClient:0x5768058›. Однако я также добавил в метод символ :display_name. Это привело к тому, что раскрывающиеся списки фильтров буквально отображали :display_name для всех вариантов раскрывающихся списков. - person PhillipKregg; 30.10.2011
comment
Ну, у вас нет для этого метода display_name. Метод to_s должен возвращать любую строку, которую вы хотите отобразить для вашего объекта ErnetClient. - person Ryan Bigg; 30.10.2011
comment
Из того, что я вижу, display_name — это метод, который уже существует в подключаемом модуле ActiveAdmin в разделе viewhelpers: github.com/gregbell/active_admin/blob/master/lib/active_admin/. Может ли быть что-то, что мешает моему приложению его увидеть? - person PhillipKregg; 30.10.2011
comment
Метод display_name предоставляется вашим представлениям, а не вашей модели. Проблема здесь в том, что ваше представление пытается вызвать to_s в вашей модели. Определите метод to_s, устраните проблему. - person Ryan Bigg; 30.10.2011
comment
Хорошо, теперь я понял: я заменил метод display_name строковой интерполяцией - #{client_name}. Я не думал, что это сработает, но я думаю, так как он находится в модели, которую он нашел в собственности. Узнавайте что-то новое о рельсах каждый день :) Большое спасибо за помощь! - person PhillipKregg; 30.10.2011

Объяснение можно найти здесь Фильтр выберите объект отображения вместо имени объекта.

# Active Admin makes educated guesses when displaying objects, 
this is the list of methods it tries calling in order
        setting :display_name_methods, [ :display_name,
                                          :full_name,
                                          :name,
                                          :username,
                                          :login,
                                          :title,
                                          :email,
                                          :to_s ]

Вы можете определить метод display_name, full_name или... (см. список выше)... в своей модели. ActiveAdmin ищет один из них.

person Eric Lavoie    schedule 17.02.2014