在 ActiveAdmin 控制器中传递变量以编辑表单

Passing variable to edit form within ActiveAdmin controller

我正在尝试将一个相当大的配置散列传递到我的编辑表单中输入的数据选项属性中。我不想将整个内容放在一行中,而是想通过将整个散列移动到一个使其更具可读性的位置来整理页面。所以这基本上就是现在的样子:

  controller do
    before_action do
      @froala_options = {
        foobar: 'baz',
        key: Figaro.env.froala_key,
        image_upload_url: upload_image_path,
        image_upload_to_s3: true,
        imageUploadToS3: Rails.application.config.x.aws.s3_upload_defaults
      }
    end
  end


# Edit

  form title: 'New Page' do |f|
    f.inputs do
      f.input :country
      f.input :title
      f.input :slug
      f.input :content, as: :froala_editor, input_html: { data: { options: @froala_options } }
    end
    actions
  end

我试过使用:

controller do 
  def edit
    # options variable here
  end
end

controller do 
  def edit
    # options variable here
    edit!
  end
end

以及:

f.input :content, as: :froala_editor, input_html: { data: { options: proc { @froala_options } } }

..无济于事。

当我检查 proc 或表单块中 binding.pry 的可用内容时,我看不到 @froala_options 变量。所有有处理 DOM 的方法。

我真的不想开始创建部分以使用 semantic_form_for 传递内容(除非我可以在此 AA 注册页面中使用它)。

我能做什么?

ActiveAdmin.register DslPort do
  form do |f|
    f.inputs do
      f.input :snmp_profile, as: :select, collection: @dsl_port.snmp_profiles
    end
    f.buttons
  end
end

f.input :snmp_profile, as: :select, collection: DslPort.find(params[:id]).snmp_profiles

ActiveAdmin 中,当您的代码执行 form do..end 块时,它会进入 ActiveAdmin::Views::ActiveAdminForm 的上下文,这超出了控制器内定义的所有实例变量的范围(比如 @froala_options)。

在这里你需要知道 AA 为那些实例变量定义了访问器,你可以从任何特定于视图的代码中访问它们。

所以解决方案非常简单:在视图上下文中使用访问器代替实例变量

form title: 'New Page' do |f|
  f.inputs do
    ...
    f.input :content, as: :froala_editor, input_html: { data: { options: froala_options } }
    ...
  end
  actions
end