我正在开发一个Web应用程序,我需要使用回形针上传图片。为了避免“找不到picture_name的处理程序”错误,我一直使用form_for帮助程序来创建包含图片的file_field。
现在,我需要上传一张图片,但是这张图片位于另一个带有“accept_nested_attributes_for”的模型中的模型中。为了避免嵌套模型的上述错误,我需要使用初始form_for中的fields_for帮助器。但是,我需要动态创建嵌套模型的新实例。为此,我总是请求嵌套模型的空实例的视图并将其附加到表单。但是,我不能将form_for用作html GET请求中的参数,因此如果我避免使用fields_for,我会再次出现“找不到picture_name的处理程序”错误。
这种要求是否有其他方法或可能的解决方案?我在互联网上冲浪了几个小时,我找不到任何可能的解决方案。
这是我使用的主要文件:
app / models / how_to.rb (父模型)
class HowTo
include Mongoid::Document
include Mongoid::Paperclip
...
# Relations
has_many :transports
accepts_nested_attributes_for :transports, allow_destroy: true
...
end
app / models / transport.rb (嵌套模型)
class Transport
include Mongoid::Document
include Mongoid::Paperclip
...
has_mongoid_attached_file :picture,
default_url: '/pictures/template.jpg',
styles: {large: ['640x160'], small: ['300x300>']}, size: { in: 0..3.megabytes },
content_type: [ "image/jpg", "image/png", "image/bmp" ], storage: :filesystem,
path: ':rails_root/public/pictures/:id/:style.:extension',
url: '/pictures/:id/:style.:extension'
validates_attachment_content_type :picture,
:content_type => ["image/jpg", "image/jpeg", "image/png", "image/bmp"]
...
end
应用/控制器/ transports_controller.rb
class TransportsController < ApplicationController
...
def new_transport_partial
respond_to do |format|
format.js {
render partial: ".../transport", layout: false,
locals: { transport: Transport.new, number: params[:number].to_i }
}
end
end
...
end
应用/视图/.../ how_to.html.haml
%div{ id: "how_to#{ how_to.id }" }
= form_for how_to, url: how_to_path( how_to ), html: { method: :put } do |f|
...
%a.add_transport_button.upload_button.green_button{ rel: how_to.id, href: '#' }
%i.fa.fa-plus
%span
= "ADD..."
- how_to.transports.each_with_index do |transport, index|
%div
= render 'transport', transport: transport, number: index, f: f
= f.submit "Submit", class: 'submit_how_to', rel: how_to.id
...
应用/视图/.../ transport.html.haml
%div.transport_partial{ rel: transport.id }
- if transport.persisted?
= hidden_field_tag :id, transport.id, name: 'how_to[transports_attributes][][id]'
= hidden_field_tag :_destroy, transport ? transport.attributes['_destroy'] : false,
disabled: true, id: "transport_destroy_#{ transport.id }", name: 'how_to[transports_attributes][][_destroy]'
= text_field_tag :title, transport.title, size: 20,
id: "transport_title_#{ transport.id}", name: 'how_to[transports_attributes][][title]'
= hidden_field_tag :number, value: number, id: "transport_number_#{ transport.id}",
name: 'how_to[transports_attributes][][number]'
= image_tag transport.picture.url(:small), id: "original_picture_#{ transport.id }_#{ number }",
class: 'transport_picture transport_preview_picture', rel: transport.id
= image_tag nil, id: "preview_picture_#{ transport.id }_#{ number }",
class: 'transport_picture transport_preview_picture', rel: transport.id
= file_field_tag :picture, value: transport.picture.url, id: "selected_file_info_#{ transport.id }_#{ number }",
class: 'selected_file_transport', size: '24', name: "how_to[transports_attributes][][picture]",
multiple: true, transport_id: transport.id, rel: number,
onchange: "readURLprofile(this, 'transport', '#{ transport.id }_#{ number }');", style: 'display:none'
%input.upload_picture.transport_upload.transport_picture_upload{ type: "button",
onclick: "$(this).parent().find('#selected_file_info_#{ transport.id }_#{ number }').trigger('click')",
transport_id: transport.id, rel: number, value: "UPLOAD" }
%a.transport_remove.upload_button.red_button{ rel: transport.id, href: '#' }
%i.fa.fa-times
%span
= "REMOVE"
提前致谢。
PD:如果您需要更多代码,请告诉我。
答案 0 :(得分:0)
在考虑了很多程序之后,我终于找到了一个有点复杂和肮脏的解决方案,但这是我的目的唯一的方法。
正如我在问题中所说,我有3个模型:如何,传输和位置。 HowTo是Transport和Transport的父级是Location的父级。 Aso,HowTo接受传输和传输的嵌套属性接受位置的嵌套属性。传输是唯一使用Paperclip具有图像的模型,我在使用fields_for和“找不到picture_name的处理程序”错误时遇到问题。
为了避免这些问题,我决定使用Remotipart gem,它允许您在不使用jQuery文件上传重新加载页面的情况下提交表单。通过这种方式,我有一个用于HowTo实例的大型表单和Transport实例的不同表单,它们独立于HowTo模型的大型形式。这些形式的Transport实例包含Location实例的嵌套属性,然后使用remotipart提交。在javascript中,我手动提交不同的传输表单,最后我继续使用大的HowTo表单。
PD:如果您需要代码,请告诉我,我会发布。