2

我有多态模型:

class Picture < ActiveRecord::Base
  belongs_to :imageable, :polymorphic => true  
end

class Service < ActiveRecord::Base
  has_many :pictures, :as => :imageable
end

class Product < ActiveRecord::Base
  has_many :pictures, :as => :imageable
end

为了让我的 activeadmin 模型与父母双方(服务和产品)一起工作,我需要执行以下操作:

ActiveAdmin.register Picture do
  def who_do_i_belong_to?
    uri = how_to_get_uri?
    if uri.match(/products/) 
      :product
    else
      :service
    end
  end

  belongs_to  who_do_i_belong_to?
end

解决方法似乎有效。我只是想念如何从 who_do_i_belong_to 中获取 url/uri?方法。

controller.controller_name # "admin/services", so it is not useful. 

提前谢谢你。

4

3 回答 3

2

如果你想为你的多态嵌套资源(products/picturesservices/pictures)提供 CRUD,你的应用程序需要有类似/admin/products/:id/images和的路由/admin/services/:id/images。问题是当你belongs_to :parent在一个register块中使用时,active_admin 只会生成一个嵌套路由admin/parents/:id/child,而你需要两个。此外,:parent不能由当前url确定,因为调用belongs_to :parent本身是用来创建当前url(资源路径)的。

为了解决这个问题,您可以在 configs.rb 中自己定义路由

namespace :admin do
  resources :services do
    resources :pictures
  end

  resources :products do
    resources :pictures
  end
end

controller.belongs_to :service, :product, polymorphic: true并通过在您的register块中写入来告诉 active_admin 使用这些路由Picture

来源:https ://github.com/gregbell/active_admin/issues/1183

于 2012-10-03T05:14:07.633 回答
1

从模型内部请求 uri 是违反 MVC 设计的。您的方法应该在您的应用程序控制器中。当你想注册一张图片时,你的当前控制器应该告诉模型它是什么。

于 2012-10-02T21:37:25.877 回答
0

你可以用它#imageable_type来找出父模型是什么。

例如:

Image.find(1).imageable_type # => "Product"
于 2012-10-02T21:47:45.980 回答