2013-10-01 4 views
0

Название говорит все. В настоящее время у меня проблема с моделью, с которой я устанавливаю, если модель может иметь вложения или не использовать include Attachable. Все идет нормально.Carrierwave удалить файл с контроллера

Затем, когда я отобразить список файлов, прикрепленных к конкретной модели, я добавляю ссылку, чтобы удалить его, такие как:

DELETE /posts/:post_id/attachments/:id(.:format)  attachments#destroy 

Для этой цели я создал AttachmentsController с методом destroy , Итак, у меня есть 2 проблемы. Во-первых, как я могу удалить файл с этого контроллера с помощью Carrierwave (для удаления самого файла и записи таблицы)? Во-вторых, так как мой присоединяемый поведение собирается быть штепсельной вилкой в ​​нескольких модели:

DELETE /posts/:post_id/attachments/:id(.:format)  attachments#destroy 
DELETE /users/:user_id/attachments/:id(.:format)  attachments#destroy 
... 

Как я могу сделать в моем AttachmentsController удалить файл в зависимости от соответствующей модели динамически?

class Attachment < ActiveRecord::Base 
    include Sluggable 

    belongs_to :attachable, polymorphic: true 
    mount_uploader :file, AttachmentUploader 

    validates :name, presence: true, if: :file? 
    validates :file, presence: true, if: :name? 
end 

class AttachmentsController < ApplicationController 
    before_action :authenticate_user! 

    def destroy 
    // Don't know how to remove that file 
    redirect_to :back 
    rescue ActionController::RedirectBackError 
    redirect_to root_path 
    end 
end 

Надеюсь, что я был чист.

Благодаря

EDIT:
Ok создать твик на Params хэш, чтобы получить соответствующий объект динамически в AttachmentsController:

private 
    def get_attachable_model 
    params.each do |name, value| 
     if name =~ /(.+)_id$/ 
     model = name.match(/([^\/.]*)_id$/) 
     return model[1].classify.constantize 
     end 
    end 
    nil 
    end 

ответ

1

Хорошо, я наконец-то нашел решение сам. Вот мой метод destroy из AttachmentsController:

def destroy 
    model, param = get_attachable_instance 
    model_attach = model.find_by slug: params[param.to_sym] 
    file   = model_attach.attachments.find_by slug: params[:id] 
    file.destroy 

    redirect_to :back 
rescue ActionController::RedirectBackError 
    redirect_to root_path 
end 

Не уверен, если это лучший способ пойти, но это не работает

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