Rails回形针没有显示图像

时间:2014-09-19 12:56:35

标签: ruby-on-rails paperclip

我是paperclip的新手,我想知道它是如何工作的。我生成了一个简单的模型Monkey并获得了以下内容:

rails g scaffold monkey description age:datetime
rails g paperclip monkey facepic
rake db:migrate

模型

class Monkey< ActiveRecord::Base

    has_attached_file :facepic, :styles => { :medium => "300x300>", :thumb => "100x100>" }

查看新/编辑

<%= form_for @monkey, :url => monkies_path, :html => { :multipart => true } do |f| %>
 ...
  <div class="field">
    <%= f.label :facepic %><br>
    <%= f.file_field :facepic %>
  </div>

查看节目

 <%= image_tag @monkey.facepic.url %>

控制器

@monkey = Monkey.new(monkey_params)

我可以创建新的猴子,但是show视图似乎找不到上传的文件。我没有错误消息,除了'missing.png'的路由错误。上传的图像没有任何痕迹。我正在使用Rails 4.1.6。我在这里错过了什么?我该如何解决这个问题?安装了gem并且还安装了imagemagick。

这就是日志所说的:

ActionController::RoutingError (No route matches [GET] "/facepics/original/missing.png"):
...

Started GET "/monkies/new" for 127.0.0.1 at 2014-09-19 14:40:22 +0200
Processing by MonkiesController#new as HTML
  Rendered monkies/_form.html.erb (4.0ms)
  Rendered monkies/new.html.erb within layouts/application (5.0ms)
Completed 500 Internal Server Error in 12ms

ActionView::Template::Error (No route matches {:action=>"show", :controller=>"monkies"} missing required keys: [:id]):

当我创建一只新猴子时,没有显示错误信息...:'(

编辑:

已创建Monkey模型,但回形针列仍为空。

3 个答案:

答案 0 :(得分:3)

此错误清楚地表明您的图片未被保存,因为has_attached_file块中未指定路径和网址。应该是这样的:

has_attached_file :facepic, 
  :path => ":rails_root/public/system/:attachment/:id/:style/:filename",
  :url => "/system/:attachment/:id/:style/:filename", 
  :styles => { :medium => "300x300>", :thumb => "100x100>" },
  :default_url => "path to default image"

此处default_url显示未上传图片时所需的图片。有关详细信息,请访问http://rdoc.info/gems/paperclip/4.2.0/Paperclip/ClassMethods%3ahas_attached_file

对于其他错误,您可以点击此链接Paperclip::Errors::MissingRequiredValidatorError with Rails 4

答案 1 :(得分:1)

Paperclip version 4.0开始,所有附件都必须包含 content_type验证文件名验证显式州他们也没有。

如果您不执行任何操作,Paperclip会引发Paperclip::Errors::MissingRequiredValidatorError错误。

在您的情况下,您可以在Post模型中添加以下任意一行, 指定has_attached_file :image

选项1:验证内容类型

validates_attachment_content_type :image, :content_type => ["image/jpg", "image/jpeg", "image/png", "image/gif"]

- 或 - 另一种方式

validates_attachment :image, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png", "image/gif"] }

- 或者 - 另一种方式

是使用 regex 来验证内容类型。

选项2:验证文件名

validates_attachment_file_name :avatar, :matches => [/png\Z/, /jpe?g\Z/, /gif\Z/]

选项3:不验证

如果出于某些疯狂的原因(可能有效但我现在想不到一个),您不希望添加任何content_type验证和允许人们欺骗内容类型并接收您不希望进入服务器的数据,然后添加以下内容:

do_not_validate_attachment_file_type :image

注意:

根据您的要求在上面的content_type / matches选项中指定MIME类型。我刚刚为您提供了一些图像MIME类型。

<强>参考:

如果您仍需要验证,请参阅 Paperclip: Security Validations 。 :)

有关详情,请访问This question

答案 2 :(得分:1)

我很遗憾地说我的问题最终是一堆事情:

  1. 必须添加:facepic到强参数
  2. 必须将内容类型的验证添加到模型
  3. Paperclip具有依赖性... 文件 - 命令,Windows上未附带该命令。 可在此处下载:http://sourceforge.net/projects/gnuwin32/?source=typ_redirect
  4. 在这三个之后,它就像一个魅力!

    谢谢大家!