我正致力于以下功能:
在一个页面中,用户可以一次上传多张图片,然后在下一页上,他可以编辑这些图片的字段。
所以我想要的基本上是一次编辑多个模型的形式(模型尚未保存在数据库中)。
应用程序使用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]等等
你们能帮助我吗?
谢谢:)
编辑:准确地说,图片不是嵌套表格或其他模型
答案 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控制器。