首页 > 解决方案 > Rails ActiveAdmin link_to 内部不同的新模型 - ActiveRecord::AssociationTypeMismatch

问题描述

我有两个带有 ActiveAdmin 面板的模型:

class Portfolio < ApplicationRecord
  has_many :portfolio_reports
end

class PortfolioReport < ApplicationRecord
  belongs_to :portfolio
end

Portfolio面板内,我希望有一个PortfolioReport为此投资组合创建的按钮(它会将管理员带到具有给定投资组合 ID 的新投资组合报告视图)。

为此,我有以下代码:

# admin/portfolios.rb
ActiveAdmin.register Portfolio do
  action_item :portfolio_report, only: :show do
    link_to 'Create Report', new_admin_portfolio_report_path(portfolio_id: portfolio.id)
  end
end

# admin/portfolio_reports.rb
ActiveAdmin.register PortfolioReport do
  permit_params :portfolio_id
  includes :portfolio

  form do |f|
    f.inputs :published_at
    tabs do
      tab 'Intro content' do
        f.inputs do
          input :portfolio, as: :hidden
          # other inputs
        end
      end
    end
  end

这给了我一个错误:

ActiveRecord::AssociationTypeMismatch in Admin::PortfolioReportsController#create
Portfolio(#523620) expected, got "" which is an instance of String(#4100)

我错过了什么?

标签: ruby-on-railsactiveadmin

解决方案


也许这会对某人有所帮助 - 问题出在错误定义的输入表单键上。在里面action_item我通过了portfolio_id

# admin/portfolios.rb
ActiveAdmin.register Portfolio do
  action_item :portfolio_report, only: :show do
    link_to 'Create Report', new_admin_portfolio_report_path(portfolio_id: portfolio.id)
  end
end

这就是 ActiveAdmin 所期望的关键:

# admin/portfolio_reports.rb
      form do |f|
        f.inputs :published_at
        tabs do
          tab 'Intro content' do
            f.inputs do
              **input :portfolio_id, as: :hidden**
              # other inputs
            end

仍然很奇怪,您不能将整个对象作为参数传递给 link_to 路径,例如new_admin_portfolio_report_path(resource). ActiveAdmin DSL 无法处理它。


推荐阅读