ruby nil的方法“variant "未定义:NilClass

du7egjpx  于 2023-03-17  发布在  Ruby
关注(0)|答案(1)|浏览(152)

我想上传文章的照片,所以我打开了动态存储,安装了三个mini_magick和image_processing gem。我还在文章模型中有两个方法负责调整照片大小,我还与照片有关系

def photo_as_thumbnail(photo)
    photo.variant(resize_to_limit: [300, 300]).processed
end
def photo_as_icon(photo)
    photo.variant(resize_to_limit: [50, 50]).processed
end

在控制器中,我添加了参数中的照片

private
    def product_params
        params.require(:article).permit(:name, :description, :price, photos: [])
    end

要在视图中显示照片,我使用以下命令:

<% @product.photos.each do |photo| %>
    <%= link_to image_tag(@product.photo_as_thumbnail(photo)), photo %>
<% end %>

列出并创建项目时,它会给出以下错误:

undefined method 'variant' for nil:NilClass
photo.variant(resize_to_limit: [50, 50]).processed

def photo_as_icon(photo)
photo.variant(resize_to_limit: [50, 50]).processed
end

但当编辑文章时,它不会给予任何错误,我可以上传和查看图像,以及保存我在不同领域所做的更改
启用活动存储并安装了两个gem mini_magick和image_processing并安装了imagemagick。在模型中添加了调整大小的方法,我希望用它来放一些更小的照片

hm2xizp9

hm2xizp91#

好的,正如max在上面的注解中指出的,由于某种原因,@product.photos中有nils,然后将其传递到您的方法中。
现在这是一个更大的问题,你可能应该深入研究为什么会发生这种情况。为此,你可能需要看看代码是一个产品的形式的一部分,或你是如何保存照片。
但在此期间,您可以通过nil检查来停止bug-可以通过以下两种方式之一来完成:
您可以检查在个别照片的方法为零,例如:

def photo_as_thumbnail(photo)
    photo.variant(resize_to_limit: [300, 300]).processed if photo
end
def photo_as_icon(photo)
    photo.variant(resize_to_limit: [50, 50]).processed if photo
end

每次检查是否为nil --这将起作用,但感觉有点重复。另外,如果您将外部代码更改为以下内容:

<% @product.photos.compact.each do |photo| %>
    <div class="photo">
      <%= link_to image_tag(@product.photo_as_thumbnail(photo)), photo %>
    </div>
<% end %>

意味着对于任何nils,你最终都会得到一堆空的div,比如:

<div class="photo">
    </div>

因此,我的首选是不要在循环中输入nils,而是在传入之前尝试压缩数组:

<% @product.photos.compact.each do |photo| %>
    <%= link_to image_tag(@product.photo_as_thumbnail(photo)), photo %>
<% end %>

这里compact会在传递给链接之前删除所有的nil,如果@product.photos本身是nil,它可能仍然会博尔克,所以要和try一起使用,try只会在被调用的对象(也就是接收方)不是nil时才调用方法:

<% @product.photos.try(:compact).each do |photo| %>
    <%= link_to image_tag(@product.photo_as_thumbnail(photo)), photo %>
<% end %>

相关问题