Rails 4,以一种形式编辑多个模型

时间:2017-09-27 15:06:56

标签: ruby-on-rails forms twitter-bootstrap-form

我正致力于以下功能:

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

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

应用程序使用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>

但是当我点击发送表格时,没有任何事情发生。

我正在考虑只使用一个表单并为每张图片生成所有字段,并将字段的名称设置为&#39; field_name_index&#39;,但它是不是很优雅。

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

你们能帮助我吗?

谢谢:)

编辑:准确地说,图片不是嵌套表格或其他模型

1 个答案:

答案 0 :(得分: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控制器。