可选的belongs_to用于重命名的active_admin资源

时间:2015-01-12 14:54:24

标签: ruby-on-rails ruby activeadmin belongs-to

如果belongs_to是可选的,则使用polymorphic_path和polymorphic_link方法创建url helper。 此方法对活动管理中的资源重命名一无所知。

如何为重命名的资源页面使用可选的belongs_to

回溯:

ActionView::Template::Error (undefined method `new_admin_region_country_region_city_path' for #<Admin::CitiesController:0x00000006bb1dd0>):
1: insert_tag renderer_for(:index)
  actionpack (4.0.9) lib/action_dispatch/routing/polymorphic_routes.rb:129:in `polymorphic_url'
  actionpack (4.0.9) lib/action_dispatch/routing/polymorphic_routes.rb:147:in `new_polymorphic_path'
  inherited_resources (1.5.1) lib/inherited_resources/url_helpers.rb:222:in `new_resource_path'
  actionpack (4.0.9) lib/abstract_controller/helpers.rb:53:in `new_resource_path'
  arbre (1.0.2) lib/arbre/element.rb:180:in `method_missing'
  /home/senid/.rvm/gems/ruby-2.1.2@belongs_to/bundler/gems/active_admin-a2cd9604c2d9/lib/active_admin/resource/action_items.rb:61:in `block in add_default_action_items'
  /home/senid/.rvm/gems/ruby-2.1.2@belongs_to/bundler/gems/active_admin-a2cd9604c2d9/lib/active_admin/views/action_items.rb:9:in `instance_exec'
  /home/senid/.rvm/gems/ruby-2.1.2@belongs_to/bundler/gems/active_admin-a2cd9604c2d9/lib/active_admin/views/action_items.rb:9:in `block (2 levels) in build'

应用程序/管理/ region_city.rb

ActiveAdmin.register RegionCity, as: 'City' do
  permit_params :name, :description, :country_id
  menu false
  belongs_to :country, parent_class: RegionCountry, optional: true
  navigation_menu :default
  filter :id_eq
end

应用程序/管理/ region_country.rb

ActiveAdmin.register RegionCountry, as: 'Country' do
  permit_params :name, :description

  filter :id_eq

  sidebar 'Links', only: [:show] do
    ul do
      li do
        link_to 'Cities', admin_country_cities_path(country_id: resource.id)
      end
    end
  end

end

应用程序/模型/ region_city.rb

class RegionCity < ActiveRecord::Base
  belongs_to :country, class_name: RegionCountry, foreign_key: :country_id
  validates :name, presence: true
  validates :country, presence: true
end

应用程序/模型/ region_country.rb

class RegionCountry < ActiveRecord::Base
  validates :name, presence: true
  has_many :cities, class_name: RegionCity, foreign_key: :country_id
end

Gemfile.lock的

GIT
  remote: git://github.com/gregbell/active_admin.git
  revision: a2cd9604c2d949f5193791045385756cee0c6865

重复错误的小型测试应用:

https://github.com/senid231/activeadmin_test_belongs_to

2 个答案:

答案 0 :(得分:2)

ActiveAdmin允许您使用belongs_to方法使用嵌套资源,如您所知:

ActiveAdmin.register Project do 
end

ActiveAdmin.register Ticket do
  belongs_to :project
end

ActiveAdmin.register Milestone do 
  belongs_to :project
end

由于Inherited Resources的火力无法识别本书中的每个自定义实现,因此您可能必须明确告诉ActiveAdmin控制器如何从父资源访问子资源。所以,你的孩子班最终会看起来像这样:

ActiveAdmin.register RegionCity, as: 'City' do
  belongs_to :country
  ...snipped....

  controller do 
    defaults :collection_name => "region_cities"
  end
end

由于ActiveAdmin使用Inherited Resources作为其权力来源,除了我的帮助之外,您可能需要的任何其他调整都可以在继承资源文档中找到。具体的这种示例位于Overwriting Defaults部分。 IR目前尚未维护,因此不要对所有Rails 3引用感到惊讶。

希望这有帮助!

答案 1 :(得分:1)

感谢Colin Graves的上述答案,这非常有用。

我遇到了一个问题,即父资源是重命名的东西,这就是我必须要做的事情:

ActiveAdmin.register Project, as 'Enterprise' do
  controller do
    defaults collection_name: 'projects', instance_name: 'project'
  end
end

ActiveAdmin.register Ticket do
  belongs_to :project, param: 'enterprise_id', route_name: 'enterprise'
end

defaults collection_name: 'projects', instance_name: 'project'表示我没有必要将现有代码中的所有projectsproject更改为enterprisesenterprise

传递给belongs_to的选项使ticket次观看次序能够找到project并正确显示。

路径&amp;网址助手已更改,因此我在admin_projects_path使用的任何地方都必须将其替换为admin_enterprises_path等。

我发现有助于发现可用选项的继承资源代码是https://github.com/josevalim/inherited_resources/blob/master/lib/inherited_resources/belongs_to_helpers.rb&amp; https://github.com/josevalim/inherited_resources/blob/master/lib/inherited_resources/class_methods.rb