ActiveAdmin嵌套自定义资源检索

时间:2014-03-19 03:27:35

标签: ruby-on-rails ruby-on-rails-4 activeadmin

我有几个带有belongs_to关系的模型。这些模型都将自定义to_param方法设置为使用资源键而不是实际id

def to_param
  return self.resource_key
end

对于我的管理模型,我有:

ActiveAdmin.register Foo do

  controller do
    def find_resource
      Foo.find_by(resource_key: params[:id])
    end
  end

  panel "Bars" do
  table_for foo.bars do
    column "Title" do |bar|
      link_to bar.title, admin_foo_bar_path(foo, bar)
    end
  end
end

end

ActiveAdmin.register Bar do
  belongs_to :foo

  controller do
    def find_resource
     Bar.find_by(resource_key: params[:id])
    end
  end
end

Foo工作正常,所有链接都是使用URL路径中的resource_key生成的。也为Bar生成了正确的URL,但是当我尝试打开Bar项时,我收到如下消息: 无法找到ID = {resource_id}

的Foo

我实际上在Bar视图中根本不需要Foo值,Bar资源键是足够的数据来查询。我要么告诉应用程序不要试图查找Foo值,要么设置Bar以通过resource_key而不是id来正确查询Foo。

我使用Rails 4和AA的1.0主分支。

1 个答案:

答案 0 :(得分:2)

两种可能的修复方法

1)尝试在belongs_to语句中使用可选项

 belongs_to :foo, :optional => true #it gives you urls for Bar without Foo

2)AA使用Inherited_resources gem,尝试自定义belongs_to(默认使用find by id)

inherited_resources的示例

belongs_to accepts several options to be able to configure the association. For example, if you want urls like "/projects/:project_title/tasks", you can customize how InheritedResources find your projects:

class TasksController < InheritedResources::Base
  belongs_to :project, :finder => :find_by_title!, :param => :project_title
end

所以这应该有帮助

belongs_to :foo , :finder => :find_by_resource_key!