代码之家  ›  专栏  ›  技术社区  ›  Nick Res

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

  •  2
  • Nick Res  · 技术社区  · 7 年前

    我试图将一个相当大的配置哈希传递到编辑表单中输入的数据选项属性中。我不想把整个内容都放在一行中,而是想通过将整个散列移动到一个更可读的地方来整理页面。这就是它现在的本质:

      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 } } }
    

    .. 无济于事。

    当我检查可用的 binding.pry 在proc或form块中,我无法看到@froala\u options变量。所有这些都是处理DOM的方法。

    我真的不想开始使用semantic\u form\u for创建partials来传递信息(除非我可以在AA register页面中使用它)。

    我能做什么?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Wasif Hossain    7 年前

    在里面 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
    
        2
  •  -2
  •   Nick Res    7 年前
    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