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

时间:2017-12-16 04:04:33

标签: activeadmin

我正在尝试将相当大的配置哈希传递到编辑表单中输入的数据选项属性中。我没有把整个事情都放在一行中,而是希望通过将整个哈希移动到一个使其更具可读性的地方来整理页面。所以这基本上就是它现在的样子:

  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注册页面中使用它)。

我该怎么办?

2 个答案:

答案 0 :(得分:3)

var mime = require('mime'); // npm install mime fs.readFile('public/images/2.jpg', { encoding: 'base64'}, function(err, data){ if(err){ console.log(err); }else{ // get the mimetype var filemime = mime.lookup(filepath); // make string data var base64= 'data:' + filemime + ';base64,' + data; // do somthing with base64 string } }); 中,当您的代码执行ActiveAdmin块时,它进入form do..end的上下文,这超出了控制器内定义的所有实例变量的范围(如ActiveAdmin::Views::ActiveAdminForm)。

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

所以解决方案非常简单:在视图上下文中使用Accessor代替Instance Variables

@froala_options

答案 1 :(得分:-2)

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