Rails 5 - проблема храма: "неопределенный метод` cached_image_data 'для nil: NilClass " - PullRequest
0 голосов
/ 05 мая 2018

Я столкнулся с некоторыми проблемами при попытке разрешить загрузку аватара с помощью Shrine. Я использую Rails 5. Я постоянно получаю сообщение об ошибке "неопределенный метод` cached_image_data 'для nil: NilClass ".

Я пытался перезапустить несколько раз и следовать различным учебным пособиям. Насколько я могу судить, я делаю все, что должен. Установлен ImageUploader, установлена ​​моя фотомодель и т. Д. Ниже приведены соответствующие фрагменты кода.

приложение / модель / photo.rb:

class Photo < ApplicationRecord

    include ImageUploader::Attachment.new(:image) 

end

приложение / закачивающий / 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

конец

Приложение / просмотров / профили / _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 %>

приложение / контроллеры / 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

конец

Любая помощь будет принята с благодарностью. Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация.

Ура, Gen

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

Хотя то, что написал 3lmin4t0r, правильно, в этом случае есть более простое решение.

В файле apps / uploaders / image_uploader.rb необходимо добавить строку

плагин: cached_attachment_data

К списку плагинов.

0 голосов
/ 05 мая 2018

Вы должны установить переменную @photo в контроллере. Если его нельзя установить, потому что он еще не существует, вы можете вместо этого вызвать @photo&.cached_image_data (обратите внимание на &) в вашей форме. Это то же самое, что вызов @photo.nil? ? nil : @photo.cached_image_data, который проверяет, не является ли @photo не nil перед вызовом # cached_image_data . Если @photo равно nil, вместо него используется значение nil и # cached_image_data никогда не будет вызвано.

См. Раздел «Оператор безопасной навигации» в заметках о выпуске 2.3.0 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...