我正在尝试将相当大的配置哈希传递到编辑表单中输入的数据选项属性中。我没有把整个事情都放在一行中,而是希望通过将整个哈希移动到一个使其更具可读性的地方来整理页面。所以这基本上就是现在的样子:
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或form块中binding.pry
可用的内容时,我无法看到@froala_options变量。所有的方法都是处理DOM的方法。
我真的不想开始使用semantic_form_for创建部分来传递内容(除非我可以在这个AA注册页面中使用它)。
我能做什么?
在ActiveAdmin
中,当你的代码执行form do..end
块时,它会进入ActiveAdmin::Views::ActiveAdminForm
的上下文,这超出了控制器内定义的所有实例变量的范围(如@froala_options
)。
在这里,您需要知道AA定义了这些实例变量的访问器,您可以从任何特定于视图的代码中访问它们。
所以解决方案非常简单:在视图上下文中使用Accessor代替Instance Variables。
form title: 'New Page' do |f|
f.inputs do
...
f.input :content, as: :froala_editor, input_html: { data: { options: froala_options } }
...
end
actions
end
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