0

我正在开发以下功能:

在一个页面中,用户可以一次上传多张图片,然后在下一页他可以编辑这些图片的字段。

所以我想要的基本上是一次编辑多个模型的表单(模型尚未保存在数据库中)。

该应用程序使用https://github.com/bootstrap-ruby/rails-bootstrap-forms来生成表单,但是如果您有一个只有来自 rails 的表单助手的解决方案,它可能足以帮助我解决我的问题.

我目前正在尝试

<%= bootstrap_form_tag(url: import_save_client_pictures_path(@client), layout: :horizontal) do |f| %>
<% @imported_pictures.each_with_index do |picture, index| %>
  <%= bootstrap_form_for([@client, picture], url: import_save_client_pictures_path(@client), layout: :horizontal) do |ff| %>
  <div class="row">
    <div class="col-xs-12 col-sm-12 col-md-4 col-lg-4">
      <%= image_tag(picture.file_tmp_url, class: 'img-responsive') %>
    </div>
    <div class="col-xs-12 col-sm-12 col-md-8 col-lg-8">
      <%= ff.text_field :title, value: picture.title, required: true %>
      <%= ff.text_field :description_en, value: picture.description_en %>
      <%= ff.text_field :description_fr, value: picture.description_fr %>
      <%= ff.text_field :description_de, value: picture.description_de %>
      <%= ff.text_field :copyright, value: picture.copyright %>
      <%= ff.collection_select :country, country_sorted_list_with_first_country(:XX), :first, :second, selected: picture.country %>
      <%= ff.collection_check_boxes :category_ids, @client.categories.visible_for(current_user), :id, :title %>
      <%= ff.text_field(:reference) if current_user.global_admin? %>
    </div>
  </div>

  <%= '<hr />'.html_safe if (index + 1) != @imported_pictures.count %>
<% end %>
  <% end %>

<div class="form-actions">
  <%= f.primary %>
 <% end %>
 <%= link_to t(:cancel), [@client, :pictures], class: 'btn btn-default' %>
 </div>

但是当我点击发送表格时,什么也没有发生。

我正在考虑只使用一个表单并为每张图片生成所有字段,并将字段名称设置为“field_name_index”之类的名称,但这不是很优雅。

我试图实现的是将某种数组传递给控制器​​,其数据类似于pictures = [picture_1_fields,picture_2_fields] 等等

你们能帮帮我吗?

谢谢 :)

编辑:准确地说,图片不是嵌套形式或其他一些模型

4

1 回答 1

0

这个答案需要您努力理解这些概念并自己实际实施。确保您仔细阅读文档!

accepts_nested_attributes_for在父模型中设置:

class Client < ApplicationRecord
  has_many :pictures
  accepts_nested_attributes_for :pictures
  validates_associated :pictures
end

class Picture < ApplicationRecord
  belongs_to :client
end

然后fields_for用于为嵌套记录生成字段:

<%= bootstrap_form_tag(url: import_save_client_pictures_path(@client), layout: :horizontal) do |f| %>
  <%= f.fields_for :pictures do |ff| %>
      <%= ff.text_field :title, value: picture.title, required: true %>
      <%= ff.text_field :description_en, value: picture.description_en %>
      # ...
  <% end %>
<% end %>

如果客户端没有图片,您可能会注意到没有输入。要解决此问题,您需要为关联播种新记录。这通常在呈现形式的动作中完成:

def new
  3.times { @client.pictures.new }
end

要允许嵌套参数,您需要使用嵌套的键数组:

def import_save_client_pictures
  if @client.update(picture_params)
    redirect_to '/somewhere'
  else
    render :some_view
  end
end

def picture_params
  params.require(:client)
    .permit(pictures_attributes: [:title, :description_en])
end

但考虑使用 AJAX 在幕后保存/更新单个 POST/PATCH 请求中的子记录。它通常会提供更好的用户体验,并且只需要一个标准的 CRUD 控制器。

于 2017-09-27T16:28:40.957 回答