【问题标题】:Rails 5 - Shrine issue: "undefined method `cached_image_data' for nil:NilClass"Rails 5 - Shrine 问题:“nil:NilClass 的未定义方法‘cached_image_data’”
【发布时间】:2018-10-15 18:34:57
【问题描述】:

我在尝试允许通过 Shrine 上传头像时遇到了一些问题。我正在使用 Rails 5。我不断收到错误消息“nil:NilClass 的未定义方法 `cached_image_data'”。

我尝试过多次重启,并按照各种教程进行操作。据我所知,我正在做我应该做的一切。 ImageUploader 已设置,我的照片模型已设置等。我在下面包含了相关的代码。

apps/models/photo.rb:

class Photo < ApplicationRecord

    include ImageUploader::Attachment.new(:image) 

end

apps/uploaders/image_uploader.rb 需要“image_processing/mini_magick”

class ImageUploader < Shrine
   plugin :processing
   plugin :versions, names: [:original, :thumb, :medium]
   plugin :delete_raw # delete processed files after uploading


process(:store) do |io, context|
    original = io.download
    pipeline = ImageProcessing::MiniMagick.source(original)
    size_80 = pipeline.resize_to_limit!(80, 80)
    size_300 = pipeline.resize_to_limit!(300, 300)
    original.close!
    # return hash of 3 sizes of the same image
    { original: io, thumb: size_80, medium: size_300 }
end

结束

app/views/profiles/_form.html.erb

<%= form_with(model: profile, local: true) do |form| %>

   <div class="field">
     <%= form.label :image %>
     <%= form.hidden_field :image, value: @photo.cached_image_data %>
     <%= form.file_field :image, id: :photo_image_data %>
   </div>

<% end %>

app/controllers/profile_controller.rb

class ProfilesController < ApplicationController
  before_action :set_profile, only: [:show, :edit, :update, :destroy]
  before_action :view_own_profile, only: [:show]

  def show
  end

   private
   def set_profile
     @profile = Profile.find(params[:id])
   end

def profile_params
  params.require(:profile).permit(:first_name, :last_name, :mobile, 
  :street_address, :suburb, :postcode, :country, :mobile, :image, 
  :latitude, :longitude, :user_id)
end

结束

任何帮助都将不胜感激。如果需要任何其他信息,请告诉我。

干杯, 创

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    您应该在控制器中设置@photo 变量。如果由于它尚不存在而无法设置,您可能需要在表单中调用@photo&amp;.cached_image_data(注意&amp;)。这与调用@photo.nil? ? nil : @photo.cached_image_data 相同,后者在调用#cached_image_data 之前检查@photo 是否不是nil。如果@photonil,则使用nil 的值,并且永远不会调用#cached_image_data

    请参阅2.3.0 release notes 的“安全导航操作员”部分。

    【讨论】:

    • 非常感谢约翰!那工作得很好。我从来没有听说过那里使用了“&”,所以这也很有帮助。
    • 我稍微改变了答案。我不确定错误的部分,所以快速测试它,似乎它只测试nil,如果变量包含false,该方法仍将被执行。我还添加了对安全导航操作员发行说明的引用。官方文档仍然缺少一些关于此的文档。
    【解决方案2】:

    虽然 3lmin4t0r 写的在这种情况下是正确的,但有一个更简单的解决方案。

    在文件apps/uploaders/image_uploader.rb中你需要添加一行

    插件:cached_attachment_data

    到插件列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多