纸夹在哪里放置缺失的.png默认图像?

5

我在我的应用程序中使用Paperclip,但我的控制器测试失败了,原因是:

BlogsControllerTest#test_should_update_blog:
Paperclip::AdapterRegistry::NoHandlerError: No handler found for "/images/original/missing.png"
    /Users/user/.rvm/gems/ruby-2.1.2/gems/paperclip-3.5.2/lib/paperclip/io_adapters/registry.rb:19:in `handler_for'
    /Users/user/.rvm/gems/ruby-2.1.2/gems/paperclip-3.5.2/lib/paperclip/io_adapters/registry.rb:29:in `for'
    /Users/user/.rvm/gems/ruby-2.1.2/gems/paperclip-3.5.2/lib/paperclip/attachment.rb:96:in `assign'

我不确定在代码中应该把 missing.png 图片放在哪里,我尝试将其放在 public/assets/original/missing.png 中,但似乎没有成功。

另外还有一些奇怪的问题:我在 paperclip.rb 初始化器中有一行代码:

Paperclip::Attachment.default_options[:default_url] = "/images/default_image.png"

但是该应用程序仍在寻找missing.png

更新:好的,我发现默认URL在模型中被覆盖了:

has_attached_file :image, styles: { big: "1200X630>", thumb: "150X150" }, default_url: "/images/:style/missing.png"

我还不知道在哪里放置这张图片。
更新2:
整个附件初始化器:
Paperclip::Attachment.default_options[:styles] = { thumb: "100x100#",  small: "200x200#",  screen: "800x600#"}
Paperclip::Attachment.default_options[:default_url] = "/images/missing.png"
Paperclip::Attachment.default_options[:path] = ":rails_root/public/assets/:class/:attachment/:id_partition/:style/:hash.:extension"
Paperclip::Attachment.default_options[:url] = "/assets/:class/:attachment/:id_partition/:style/:hash.:extension"
Paperclip::Attachment.default_options[:hash_secret] = "XXXXXXXXXXXXXXXXX"
Paperclip.registered_attachments_styles_path = "public/assets/paperclip_attachments2.yml"

UPDATE3: 检查实际上引发异常的paperclip代码,异常是由 这段代码 引起的,它基本上测试了所有可用的适配器,最接近我想要做的是 fileAdapter,它测试传递的字符串是否为文件。
我对此感到非常惊讶,我认为我可能在这里犯了什么错误。如果我将初始化器行替换为:
Paperclip::Attachment.default_options[:default_url] = File.new "public/images/missing.png"

然后异常就不同了:

BlogsControllerTest#test_should_update_blog:
NoMethodError: undefined method `gsub' for #<File:public/images/missing.png>
    /Users/user/.rvm/gems/ruby-2.1.2/gems/paperclip-3.5.2/lib/paperclip/interpolations.rb:33:in `block in interpolate'
    /Users/user/.rvm/gems/ruby-2.1.2/gems/paperclip-3.5.2/lib/paperclip/interpolations.rb:32:in `each'

更新4:这是测试的样子:
  test "should update blog" do
    put :update, id: @blog, blog: { 
      author_id: @blog.author_id, 
      body: @blog.body, 
      image: @blog.image, 
      title: @blog.title
    }
    assert_redirected_to blog_path(assigns(:blog))
  end

 test "should create blog" do
    assert_difference('Blog.count') do
      post :create, blog: { 
        author_id: @blog.author_id, 
        body: @blog.body, 
        image: @blog.image, 
        title: @blog.title }
    end

    assert_redirected_to blog_path(assigns(:blog))
  end

那么:

@blog.image.class
=> Paperclip::Attachment
@blog.image.url
=> "/images/missing.png"

有更新了吗,@don guilio? - Filip Bartuzi
1
将图片放在 /public/images/* 中,并设置 has_attached_file: default_url: "/image/*"。不过这有点奇怪,如果没有分配默认的附件,你要保存一个默认附件吗? - DDDD
1
不,你在*的位置放置文件名。 - DDDD
1
你的测试看起来怎么样?@dongiulio - Filip Bartuzi
1
注意!如果你想让模型使用:default_url,不要在参数中发送:image。请从参数中删除image,然后看看效果如何。 - Filip Bartuzi
显示剩余9条评论
2个回答

12

对于这行代码:

Paperclip::Attachment.default_options[:default_url] = "/images/default_image.png"

Paperclip正在寻找/public/images/default_image.png下的图像。

更新:

因此,您已定义了bigthumb样式。根据您在<% image_tag @model.image.url(:style) %>中调用哪种样式,Paperclip将在public/images/thumb/default_image.pngpublic/images/big/default_image.png中查找图像。

更新#2(根据作者问题的更新#4)

明白了!如果您希望该模型使用:default_url,请不要在参数中发送:image。从参数中删除图像,然后看看会发生什么。


好的,我已经取消了默认图像覆盖,并将初始化器更改为"/images/missing.png",并在/public/images/missing.png下放置了一张图片,但我仍然收到错误消息No handler found for "/images/missing.png" - Don Giulio
你只是想确认一下:你重启了 Rails 服务器吗? - Filip Bartuzi
谢谢,我已经将文件放在这两个目录中,但没有改善。我已经更新了整个Paperclip初始化程序的问题描述。 - Don Giulio
1
所以根据@EgeErsoz的指示,可能不需要在@model.image.url(:style)方法中指定:style。如果这样做,它将在public/images/original中查找图像。解决方案很简单:在.url()方法中指定:style或将missing.png添加到目录public/images/original/missing.png中。 - Filip Bartuzi
这里与视图无关,模型中的has_attached_file验证器触发了异常,我在视图中没有使用默认图像。 - Don Giulio
显示剩余3条评论

7
在Rails 5中,我成功地使用了路径中的:style
Paperclip::Attachment.default_options[:default_url] = "/images/folder/:style/missing.png"

如果,例如,这张图片不存在:

<%= image_tag @photo.picture.url(:medium) %>

结果是

/images/folder/medium/missing.png

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接