【问题标题】:uploading files to rails 4.0 with paperclip and simple_form使用回形针和 simple_form 将文件上传到 rails 4.0
【发布时间】:2014-07-13 19:08:28
【问题描述】:

编辑: 正如@Justin 所说,我可能在试图找到解决方案时搞砸了,甚至没有意识到,哎呀...将参数更改为 params.require(:pin).permit( :image, :description) 确实解决了。
虽然它现在不起作用,因为我得到一个“具有与其内容不匹配的扩展名。

我正在关注 Rails 一个月,并试图将上传图像放入脚手架工作。 我正在使用回形针文件和 simple_form。这是我认为相关的代码(请随意询问):

_pin_form.erb.html

<%= simple_form_for(@pin, :html => {:multipart => true}) do |f| %>
 <%= f.error_notification %>

 <div class="form-inputs">
   <%= f.file_field :image, :label => "Upload an image" %>
   <%= f.input :description, as: :text %>
 </div>

 <div class="form-actions">
   <%= f.button :submit %>
 </div>

pin.rb

class Pin < ActiveRecord::Base

 has_attached_file :image
 belongs_to :user

 validates :description, :presence => true
 validates :user_id, :presence => true
 validates_attachment :image, :presence => true

# Validate content type
 validates_attachment_content_type :image, :content_type => /\Aimage/
# Validate filename
 validates_attachment_file_name :image, :matches => [/png\Z/, /jpe?g\Z/]
# Explicitly do not validate
 do_not_validate_attachment_file_type :image
end

pin_params 来自 pins_controller.rb

def pin_params
  params.permit(:description, :image)
end

(其中大部分是当我尝试通过回形针自述文件进行故障排除时)。 每当我上传文件时,我都会收到一条错误消息

ActionController::ParameterMissing in PinsController#create
param not found: image

如果我尝试在某些东西上使用 params.require,我会收到一条错误消息,提示找不到参数。 我不知道是什么原因造成的。如果我删除 pin_params 方法,表单字段只会返回“不能为空白”,无论其中有什么”
这看起来很简单,但我就是找不到解决方案

【问题讨论】:

  • 使用params.require(:pin).permit(:description, :image) 时出现错误?同样使用 simple_form,您只需指定 f.input :image, label: "Upload an image"
  • 你应该用强大的参数来计算,因为我猜图像不仅仅是一个属性,它是一个数组。 stackoverflow.com/questions/19664744/…
  • 能否请您显示从视图进入控制器的参数。
  • @Zishe,如果他在他的pins 表上正确设置了他的迁移以用于回形针,他不应该在他的参数中指定。
  • 您的模型有 3 个验证器用于 image。通常,您应该只拥有其中之一 - 验证内容类型、文件类型或您不想进行任何验证的状态。您的新错误来自内容类型验证器 - 您的操作系统是什么?

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

Paperclip 具有欺骗验证功能,以确保文件内容与扩展名实际匹配。此验证部分通过使用操作系统的file 命令来确定文件内容来实现。不幸的是,Windows 没有file 命令,因此验证总是会失败。

要解决此问题,您应该禁用欺骗。使用以下代码创建一个初始化程序:

module Paperclip
  class MediaTypeSpoofDetector
    def spoofed?
      false
    end
  end
end

离开validates_attachment_content_type 验证器是有效的,因为它仍然是限制允许用户上传的文件类型的最佳方式。您只需要禁用此验证的欺骗位。

【讨论】:

  • 啊,我明白了。我注意到回形针自述文件中的文件命令部分,但没有意识到它已连接。非常感谢您(和@justin)的帮助:)
  • 虽然这可行,但这将是一种解决方法 - 您的系统如何欺骗文件以检查其类型?
  • @RichPeck 我使用的是 ubuntu,而不是 Windows。即便如此,我还是不得不稍微破解MediaTypeSpoofDetector,因为file --mime-type 并不总是有效;所以如果失败了,我会改用mimetype。我同意 Paperclip 中的欺骗检测器正在尝试做的事情,但它似乎确实在其实施中引起了很多问题。
  • 感谢 Graeme 的澄清。当然 - 它会导致 mannnnny 问题 - 很高兴见到知道如何解决的人:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多