我是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模型,但回形针列仍为空。
答案 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
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 来验证内容类型。
validates_attachment_file_name :avatar, :matches => [/png\Z/, /jpe?g\Z/, /gif\Z/]
如果出于某些疯狂的原因(可能有效但我现在想不到一个),您不希望添加任何content_type
验证和允许人们欺骗内容类型并接收您不希望进入服务器的数据,然后添加以下内容:
do_not_validate_attachment_file_type :image
注意:
根据您的要求在上面的content_type
/ matches
选项中指定MIME类型。我刚刚为您提供了一些图像MIME类型。
<强>参考:强>
如果您仍需要验证,请参阅 Paperclip: Security Validations 。 :)
有关详情,请访问This question
答案 2 :(得分:1)
我很遗憾地说我的问题最终是一堆事情:
在这三个之后,它就像一个魅力!
谢谢大家!