Rails Вызов изображения из статьи, загруженной в статью через shrine

Привет, ребята, я хочу создать окно у себя дома, где будет отображаться моя последняя статья, в поле должно быть заголовок и несколько строк содержания сообщения (что, я думаю, вполне выполнимо), но я также хочу иметь изображение, которое находится в посте, загружено через shrine и trix. В общем, я не знаю, как получить изображения из сообщений, чтобы использовать их. Я знаю, что было бы сложно, если бы изображений было больше, но тогда я бы хотел их рандомизировать.

Моя модель post.rb

class Post < ApplicationRecord
  validates :title, :content, :presence => true
  extend FriendlyId
  friendly_id :title, use: :slugged
end

моя модель image.rb

class Image < ApplicationRecord
# adds an `image` virtual attribute
include ::PhotoUploader::Attachment.new(:image)

end

мой контроллер изображений

class ImagesController < ApplicationController
  respond_to :json

  def create
    image_params[:image].open if image_params[:image].tempfile.closed?

    @image = Image.new(image_params)

    respond_to do |format|
      if @image.save
        format.json { render json: { url: @image.image_url }, status: :ok }
      else
        format.json { render json: @image.errors, status: :unprocessable_entity }
      end
    end
  end

  private

  def image_params
    params.require(:image).permit(:image)
  end

конец


person Sebastian    schedule 18.08.2018    source источник


Ответы (1)


Вам необходимо создать подпись для обработки нескольких файлов. Со святыней это будет выглядеть так:

# db/migrations/001_create_photos.rb
create_table :images do |t|
  t.integer :imageable_id
  t.string  :imageable_type
  t.text    :image_data
  t.text    :image_signature
end
add_index :images, :image_signature, unique: true

# app/uploaders/image_uploader.rb
class ImageUploader < Shrine
  plugin :signature
  plugin :add_metadata
  plugin :metadata_attributes :md5 => :signature

  add_metadata(:md5) { |io| calculate_signature(io) }
end

# app/models/image.rb
class Image < ApplicationRecord
  include ImageUploader::Attachment.new(:image)
  belongs_to :imageable, polymorphic: true

  validates_uniqueness_of :image_signature
end

Также для обеспечения согласованности в вашем коде назовите его изображением или фотографией. Ваш загрузчик называется "Фото", но везде он называется "Изображение".

Последнее изменение, которое вам нужно, это в вашем контроллере, чтобы он принимал массив изображений вместо одного изображения. Для этого вам нужно просто использовать массив:

def show
  @image = Image.order('RANDOM()').limit(1).first
end

private
def images_params
  params.require(:images).permit(images: [)
end
person Todd Baur    schedule 18.08.2018
comment
мне нужно добавить и их t.integer: imageable_id t.string: imageable_type или мне просто нужно запустить add_index: images,: image_signature, unique true? - person Sebastian; 19.08.2018
comment
Не видя вашей схемы, я не уверен, но предполагаю, что у вас нет этих столбцов в вашей базе данных. - person Todd Baur; 20.08.2018