2012-05-04 2 views
8

У меня проблема с динамической активной областью администрирования. Я пытаюсь создать область для каждого «менеджера» «проекта» в моем приложении. Однако области видимости не обновляются, когда создается новый менеджер (или назначается проекту), но они обновляются, если я перезапускаю сервер. Поэтому код «работает» как таковой, но, очевидно, не так, как мне хотелось бы. Я рубин/rails noob, поэтому я не уверен, что мне нужно что-то сделать, чтобы «обновить» область в некотором роде.Области активного администратора для каждого экземпляра связанной модели

В качестве FYI, я использую Rails 3.2 на Heroku Кедр с ActiveAdmin

Вот код в вопросе (который работает, но приносит только в новых менеджеров после перезапуска сервера):


Manager.find_each do |m| 
    scope m.first_name do |projects| 
    projects.where(:manager_id => m.id) 
    end 
end 

И вся Активная модель Администратор проекта:

ActiveAdmin.register Project do 
menu :priority => 1 
index do 
    column :name 
    column :company_name 
    column :status 
    column :projection do |project| 
    number_to_currency project.projection 
    end 
    column :updated_at 
    default_actions 
end 

scope :all 
scope :working, :default => true do |projects| 
    projects.where(:status => 'working') 
end 

Manager.find_each do |m| 
    scope m.first_name do |projects| 
    projects.where(:manager_id => m.id) 
    end 
end 
end 
+0

Следующий ответ велик. Я не понимаю, почему вы не отметили это как ответ. –

ответ

1

Rails загружает только классы по в режиме производства. Это означает, что ваши области отображаются только один раз, а затем они кэшируются. Вот почему новые области не отображаются до перезагрузки. То же самое было бы правдой, если бы вы отредактировали имя менеджера в вашем случае.

Я думаю, что решение может заключаться в использовании лямбды или Proc, но за несколько минут, в которые я играл, я не увенчался успехом. Возможно, не удастся написать файл activadmin.

+0

Правильно, что это невозможно. Способ, которым activeadmin реализовал свою обертку области вокруг метода активной записи, запрещает это. Возможно, метод «reload_scope» может быть каким-то образом открыт для activerecord после сохранения/фиксации крючков. Вы знаете, как это сделать? –

2

Настоящие динамические области внутри блоков регистров АА не будут работать. Я имею в виду, что изменения в таблице Менеджера не будут отражаться в динамических областях с инициализацией. Также см .: https://github.com/gregbell/active_admin/wiki/Creating-dynamic-scopes. Вы можете попробовать использовать фильтры вместо областей. Тогда вы можете написать что-то вроде:

filter :managers, :as => :select, :collection => proc { Manager.order('name ASC').map(&:first_name) } 

и изменения в свойствах менеджеров будут отображаться (после обновления страницы) без перезапуска сервера. Также проверьте https://github.com/gregbell/active_admin/issues/1261#issuecomment-5296549

Также обратите внимание, что активные диапазоны регистрации! из активных областей администрирования. Вы можете проверить

http://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/scope

+1

Спасибо! Инкапсуляция коллекции в proc корректна, поэтому она выполняется по требованию. Это также решает проблемы «rake db: schema: load» и «rake db: migrate». Фильтры ActiveAdmin будут пытаться получить доступ к схеме до ее создания, если не включены в proc. – scarver2

3

Я нашел, что это работает для меня:

ActiveAdmin файл

scope :working, :default => true do |projects| 
    Project.working 
end 

Модель

scope :working, -> { where(:status => 'working') } 

Немного поздно в ответ, но надеюсь, это поможет кому-то.

+2

Это действительно работало, чтобы создать несколько областей? Я вижу, что создается одна область. – James

10

Вот реальное решение этой проблемы ... Использование альтернативных фильтров Altho является более желательной стабильностью и техобслуживанием, это выглядит лучше в ActiveAdmin и более удобен для пользователя, так как области становятся привлекательными вкладками.

Это немного рубить, но это жизнеспособное решение, где уместно:

Хитрость заключается в том, чтобы обновление осциллографы в before_filter на указательном контроллеры действия.

Это могло стать плохо, если у вас есть много областей, созданных на ресурсе (Altho вы можете легко установить некоторые ограничения)

ActiveAdmin.register Project do 
    menu :priority => 1 
    index do 
    column :name 
    column :company_name 
    column :status 
    column :projection do |project| 
     number_to_currency project.projection 
    end 
    column :updated_at 
    default_actions 
    end 

    scope :all 
    scope :working, :default => true do |projects| 
    projects.where(:status => 'working') 
    end 

    controller do 
    before_filter :update_scopes, :only => :index 

    def update_scopes 
     resource = active_admin_config 

     Manager.all.each do |m| 
     next if resource.scopes.any? { |scope| scope.name == m.first_name } 
     resource.scopes << (ActiveAdmin::Scope.new m.first_name do |projects| 
      projects.where(:manager_id => m.id) 
     end) 
     end 

     # try something like this for deletions (untested) 
     resource.scopes.delete_if do |scope| 
     !(Manager.all.any? { |m| scope.name == m.first_name } || ['all', 'working'].include?(scope.name)) # don't delete other scopes you have defined 
     end 

    end 
    end 
end 
+0

Благодаря Daxter на github для вынесения некоторых рекомендаций: [Associated GitHub Issue] (https://github.com/gregbell/active_admin/issues/1261#issuecomment-22207740) –

+0

о том, когда они будут удалены? –

+1

Я не настроен для тестирования, но я просто добавил код, который должен помочь в делециях. –

Смежные вопросы