没有处理程序发现嵌套回形针的错误

时间:2014-07-27 11:27:45

标签: ruby-on-rails mongoid paperclip nested-attributes

我正在开发一个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
        &nbsp;
      = 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:如果您需要更多代码,请告诉我。

1 个答案:

答案 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:如果您需要代码,请告诉我,我会发布。