Загрузка файлов с использованием CarrierWave, SimpleForm, InheritedResources и полиморфных ассоциаций

У меня возникают проблемы с получением вложенных атрибутов для работы с загрузкой файлов с использованием полиморфизма. Вот соответствующий исходный код из моего приложения.

Приложение / закачивающие /image_uploader.rb

# encoding: utf-8

class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::RMagick
  storage :file

  version :thumb do
    process resize_to_fill: [50, 50]
    process convert: 'jpg'
  end

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
end

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

class Photo < ActiveRecord::Base
  attr_accessible :image, :imageable_id, :imageable_type
  belongs_to :imageable, polymorphic: true 
  mount_uploader :image, ImageUploader
  validates_presence_of :image, :imageable_id, :imageable_type
end

приложение / контроллеры /photos_controller.rb

  class PhotosController < InheritedResources::Base
    def create
      # TODO enforce imageable_id belongs to current account
      @photo = Photo.new(params[:photo])
      if @photo.save
        redirect_to @photo.imageable, notice: 'Photo saved'
      else
        flash[:error] = 'Photo could not be saved'
        redirect_to(:back)
      end
    end
  end

приложение / модели / listing.rb

class Listing < ActiveRecord::Base
    attr_accessible :photos_attributes
    has_many :photos, :as => :imageable, :dependent => :destroy
    accepts_nested_attributes_for :photos
    mount_uploader :logo, ImageUploader
end

приложение / просмотров / объявления / show.html.haml

%p
  %b Photos:
  %ul.inline
    - @listing.photos.each do |photo| 
      %li= link_to(image_tag(photo.image_url(:thumb)), photo.image_url)

= simple_form_for @listing.photos.new do |f|
  = f.hidden_field :imageable_id
  = f.hidden_field :imageable_type
  = f.input :image, as: :file
  = f.submit 'Upload'

Приведенная выше форма работает, но передача:imageable_id и:imageable_type кажется мне хакерской и может легко привести к проблемам безопасности массового назначения. Кроме того, для этого необходимо, чтобы у меня были attr_accessible в Photo и photos_controller.rb и RESTful маршруты к:photos. Все это кажется очень неправильным.

Вот моя оригинальная форма, которая больше напоминала Rails, но она не работала. Кажется, что полиморфная ассоциация как-то мешает. Я думаю, что атрибуты фотографий должны публиковаться с параметрами [:list] вместо отдельных параметров [:photo].

приложение / просмотров / объявления /_form.html.haml

= simple_form_for @listing do |f|
  = simple_fields_for :photos, @listing.photos.new do |pf|
    = pf.input :image, :as => :file
  = f.submit 'Upload'

Может кто-нибудь показать правильный способ сделать это?

0 ответов

Другие вопросы по тегам