2016-10-21 4 views
0

Я работаю над приложением rails и создаю вложенный ресурс для изображений. Модель Picture, и она полиморфна и взаимодействует с несколькими разными таблицами.rails paperclip: param отсутствует или значение пуст

Я работаю над действием контроллера и методом создания. Согласно this answer и другим вещам, которые я видел с помощью скрепки, параметры должны соответствовать формату table_name, а затем file. Даже при этом я все еще получаю ошибку param is missing or the value is empty: picture.

Вот мой код:

Picture.rb

class Picture < ActiveRecord::Base 
    belongs_to :imageable, polymorphic: true 
    has_attached_file :image, style: { small: '64x64', medium: '100x100', large: '200x200' } 
    validates_attachment :image, presence: true, content_type: { content_type: /\Aimage\/.*\Z/ }, 
         size: { in: 0..5.megabytes }, default_url: 'missing_img.png' 


    acts_as_list scope: [:imageable_id, :imageable_type] 
end 

pictures_controller.rb

class PicturesController < ApplicationController 
    before_action :authorize_user! 
    before_action :set_resource! 

    def index 
    @pictures = @resource.pictures 
    end 

    def create 
    @picture = @resource.pictures.new(picture_params) do |pic| 
     pic.imageable_type = @resource 
     pic.imageable_id = @resource.id 
    end 
    if @picture.save 
     redirect_to :back 
     flash[:success] = 'Image Saved!' 
    else 
     redirect_to :back 
     flash[:danger] = "#{@picture.errors.full_messages.to_sentence}" 
    end 
    end 

    def destroy 
    @picture = Picture.find(params[:id]) 
    @resource.pictures.delete(@picture) 
    redirect_to :back 
    flash[:success] = "Picture deleted" 
    end 

    private 
    def set_resource! 
    klass = [Gym, User, Location, Product].detect { |c| params["#{c.name.underscore}_id"] } 
    @resource = klass.find(params["#{klass.name.underscore}_id"]) 
    end 

    def picture_params 
    params.require(:picture).permit(:image) 
    end 
end 

фото/index.html

<h6>Upload Pictures</h6> 
    <%= form_for(current_user, url: url_for(controller: 'pictures', action: 'create'), method: :post, html: { multipart: true, class: 'form-horizontal' }) do |f| %> 
    <%= f.file_field :image, type: :file, multiple: true, style: 'padding-bottom: 25px;' %> 
    <%= f.submit "Upload", class: "btn btn-gen" %> 
<% end %> 

А вот запрос на форме паров представить:

{"utf8"=>"✓", 
"authenticity_token"=>"+fsA6liECF7pkUp/0BA0wDHq9Vv63jB+WBb7O/uUEDhhmIOZ22Rb1rNWDwuwPTDPNS7jg7vP/fVCVllDV21wDw==", 
"user"=>{"image"=>[#<ActionDispatch::Http::UploadedFile:0x007f87b138acf8 @tempfile=#<Tempfile:/var/folders/9c/1_0mk00n297f560_fpv9jzl40000gn/T/RackMultipart20161020-25582-3qt3gc.jpg>, 
@original_filename="b4lROOR.jpg", 
@content_type="image/jpeg", 
@headers="Content-Disposition: form-data; name=\"user[image][]\"; filename=\"b4lROOR.jpg\"\r\nContent-Type: image/jpeg\r\n">]}, 
"commit"=>"Upload", 
"user_id"=>"15"} 

Даже с этим, я все еще получаю ошибку. Кто-нибудь видит что-то неправильное, что я делаю в своем коде, который я мог бы исправить? Буду признателен за любую оказанную помощь.

ответ

0

Я выяснил временную работу. Определенно не идеально, и если у кого-то есть лучшее предложение, я бы с удовольствием его услышал. Но вот то, что у меня сейчас есть, работает.

def create 
    pic = nil 
    if params[:user]['image'] 
    params[:user]['image'].each do |image| 
     pic = @resource.pictures.create(image: image, imageable_type: @resource, imageable_id: @resource.id) 
    end 
    if pic.save 
     redirect_to :back 
     flash[:success] = 'Image Saved!' 
    else 
     redirect_to :back 
     flash[:danger] = "#{pic.errors.full_messages.to_sentence}" 
    end 
    else 
    flash[:danger] = "Picture file not found" 
    redirect_to :back 
    end 
end 
1

Проблема заключается в том, что ваш метод picture_params требует ключа пар маршрута picture в то время как ваша форма имеет ключевое user.

позволяет сделать некоторые рефакторинга:

private 
    def set_resource! 
    @resource = resource_class.find(params[param_key + "_id"]) 
    end 

    def resource_class 
    @resource_class ||= [Gym, User, Location, Product].detect do |c| 
     params[ param_key(c) + "_id" ] 
    end 
    end 

    def param_key(klass = resource_class) 
    ActiveModel::Naming.param_key(klass) 
    end 

    def picture_params 
    params.require(param_key).permit(:image) 
    end 

Вместо klass.name.underscore мы используем ActiveModel::Naming, который, как рельсы выясняет, как использовать модели для вещей, как маршруты, PARAMS или переводы.

+0

Это замечательно, и отличный рефактор! Единственная проблема, которую я испытываю при использовании этого, в моей форме, я получаю сообщение об ошибке, что изображение не было добавлено. Я еще немного отлаживаю и дам вам знать –

Смежные вопросы