Ruby on rails 在动态加载(嵌套)表单字段中上载与模型无关的Rails 4文件

Ruby on rails 在动态加载(嵌套)表单字段中上载与模型无关的Rails 4文件,ruby-on-rails,file-upload,nested-forms,nested-attributes,form-helpers,Ruby On Rails,File Upload,Nested Forms,Nested Attributes,Form Helpers,我正在寻找一种将简单图像上传到文件系统的方法,这样图像就不会存储在数据库中。我知道这一步相当简单,只需使用一个file_输入标记,但是由于我的表单是如何构建的,我在实现这一步时遇到了问题 我有一个项目,通过让用户为页面指定页面布局或模板来创建静态活动页面。用户选择要为其页面加载的模板后,将加载一个表单,该表单包含指定模板包含的每个小部件的一个部分。用户输入他们的信息,按submit,然后创建一个静态页面 其中一个小部件是图像小部件,用户应在其中从系统中选择一个文件,并在提交表单时将其上载到服务器

我正在寻找一种将简单图像上传到文件系统的方法,这样图像就不会存储在数据库中。我知道这一步相当简单,只需使用一个file_输入标记,但是由于我的表单是如何构建的,我在实现这一步时遇到了问题

我有一个项目,通过让用户为页面指定页面布局或模板来创建静态活动页面。用户选择要为其页面加载的模板后,将加载一个表单,该表单包含指定模板包含的每个小部件的一个部分。用户输入他们的信息,按submit,然后创建一个静态页面

其中一个小部件是图像小部件,用户应在其中从系统中选择一个文件,并在提交表单时将其上载到服务器。问题是,由于我如何使用表单帮助程序,我面临的问题是,文件上载将文件名作为字符串而不是IO对象()。我需要帮助来解决这个问题

将数据输入页面的表单(存储在表campaign_pages中)如下所示:

= form_for(@campaign_page, class: 'form-horizontal') do |f|
  fieldset
    legend Basic page information
    .form-group
      = f.label :featured, class: 'control-label col-lg-2'
      .col-lg-10
        = f.check_box :featured, class: 'form-control'

      = f.label :title, class: 'control-label col-lg-2'
      .col-lg-10
        = f.text_field :title, placeholder: 'Unique and really catchy page title!', class: 'form-control'

      = f.label :campaign_id, 'Campaign: ', class: 'control-label col-lg-2'
      .col-lg-10
        = f.select :campaign_id, options_from_collection_for_select(@campaigns, 'id', 'campaign_name', @campaign), {}, html_options= {:class => 'form-control'}

      = f.label :language_id, 'Language: ', class: 'control-label col-lg-2'
  .col-lg-10
        = f.select :language_id, options_from_collection_for_select(Language.all,'id', 'language_name'), {}, html_options= {:class => 'form-control'}

      label for='template_id' class='control-label col-lg-2' Template: 
  .col-lg-10
        = select_tag 'template_id', options_from_collection_for_select(@templates, 'id', 'template_name', @template), class: 'form-control'
      | data-no-turbolink="true"
在这里,一旦选择了模板,页面上每个小部件的内容表单就会被加载:

    #widget_location
      = render :file => 'templates/show_form', layout: false

    .form-group
      = f.submit 'Save Page', class: 'btn btn-sm btn-primary'
图像小部件(产生问题)的表单如下所示:

#image_widget_form.form-group
  = label_tag 'widgets[image][image_url]', 'Image URL:', class: 'control-label col-lg-2'
  .col-lg-10
    = text_field_tag 'widgets[image][image_url]', options['image_url'], class: 'form-control'
    = hidden_field_tag 'widgets[image][widget_type]', WidgetType.find_by(:widget_name => 'image').id
    = file_field_tag 'widgets[image][image_upload]'
在阅读文档()和其他问题报告之后,我的理解是问题是“multipart=>true”,如果希望文件字段标记正常工作,则必须指定这一点。这应该不是问题,因为我在@campaign\u页面上使用form_,而不是form_标签。但是,这些小部件及其内容不属于活动页面表,因此它们不会在活动页面的模型中指定。因此,我不能简单地使用f.file_字段作为文件输入

我正在寻找解决办法。使用嵌套属性然后使用字段_进行图像上载是否可行


另一个问题是小部件的规范和内容存储在Postgres JSONB字段中,我不确定嵌套属性如何处理这些小部件。

我假设表单设置了multipart,因为根据Rails文档,为帮助器的表单指定multipart=>true是不必要的。不过,修复程序非常简单-在表单标记的html选项哈希中设置multipart:true后,它就可以工作了:

= form_for(@campaign_page, class: 'form-horizontal', html: {multipart: true}) do |f|
...