রেলস পেপারক্লিপ কীভাবে সংযুক্তি মুছবেন?


84

আমি রেল 3 এ পেপারক্লিপ (ডাব্লু / অ্যামাজন এস 3) ব্যবহার করছি I আমি কোনও আপডেটের ক্রিয়া ব্যবহার না করে কোনও বিদ্যমান সংযুক্তিটি প্রতিস্থাপন না করে মুছতে চাই ।

আমি এর একটি উদাহরণ এখানে পেয়েছি এবং এটি কাজ করতে পারিনি, এটি কেবল মুছবে না এবং লগগুলিতে কেন নেই তা বলার মতো কিছুই নেই। আমি ফর্মটিতে এই জাতীয় কিছু করতে চেয়েছিলাম:

<%- unless @page.new_record? || !@page.image? -%>
    <%= f.check_box :image_delete, :label => 'Delete Image' %>
<%- end -%>

(পৃষ্ঠাটি মডেলের নাম, চিত্রটি সেই বৈশিষ্ট্যের নাম যা সংযুক্তিটি ধারণ করে)

তবে কীভাবে আমি সেই চেকবক্সটি সনাক্ত করব এবং আরও গুরুত্বপূর্ণভাবে আমি কীভাবে চিত্রটি মুছব? আমি কোন সাহায্যের প্রশংসা করি!

উত্তর:


104

প্রথমে, যখন আপনি একটি ফর্ম_একটি চেক_বক্স তৈরি করেন (যা দেখে মনে হয় আপনি হ'ল), তখন ফর্মটি ডিফল্টরূপে প্রেরণ করা উচিত: চেক করা থাকলে চিত্র_ডিলিট "1" এবং যদি চেক না করা হয় তবে "0" হিসাবে মুছে ফেলা উচিত। পদ্ধতির ঘোষণাটি এর মতো দেখাচ্ছে:

def check_box(method, options = {}, checked_value = "1", unchecked_value = "0")

যা দেখায় যে আপনি চাইলে অন্যান্য মান নির্ধারণ করতে পারেন, তবে এটি অবশ্যই .চ্ছিক।

দ্বিতীয়ত, যে মডেলটির সাথে এটি সংযুক্ত রয়েছে তা মোছা না করে ম্যানুয়ালি একটি সংযুক্তি মোছার কলটি:

@page.image.destroy #Will remove the attachment and save the model
@page.image.clear #Will queue the attachment to be deleted

এবং চেকবক্সের মাধ্যমে চিত্রগুলি মুছার আপনার উপায়টি সম্পাদন করতে সম্ভবত আপনার পৃষ্ঠা মডেলটিতে এটির মতো কিছু যুক্ত করুন:

class Page < ActiveRecord::Base
  has_attached_file :image

  before_save :destroy_image?

  def image_delete
    @image_delete ||= "0"
  end

  def image_delete=(value)
    @image_delete = value
  end

private
  def destroy_image?
    self.image.clear if @image_delete == "1"
  end
end

এইভাবে, আপনি যখন আপনার ফর্ম তৈরি করবেন এবং এতে: চিত্র_ডিলিট চেকবক্স যুক্ত করবেন, এটি ব্যবহারকারীর উদাহরণ থেকে ডিফল্ট মান "0" লোড করবে। এবং যদি সেই ক্ষেত্রটি চেক করা থাকে তবে কন্ট্রোলার চিত্র_ডিলিটটি "1"-তে আপডেট করবে এবং ব্যবহারকারী সংরক্ষণের পরে এটি চিত্রটি মুছতে হবে কিনা তা পরীক্ষা করবে।


এই উদাহরণস্বরূপ, পৃষ্ঠা # চিত্রটি কি অন্য কোনও মডেলকে বোঝায় যা has_attached_fileবা পৃষ্ঠার সংযুক্তি, নামটির চিত্র রয়েছে?
জন বাচির

@ পেজটি এমন মডেল পরিবর্তনশীল যা চিত্র_প্যাচ করেছে: চিত্রটি, তবে আমি মনে করি কোনও কারণে মডেলটির নামকরণ করা হয়েছে। আমি স্পষ্ট করে পরিবর্তন করব এবং আপডেট করব।
ড্যানম্যানে

ঠিক আছে, এটি আরও
সার্থক করে

আমি বুঝতে পারছি না আপনি কেন কেবল এখানে স্ব.আইমেজ.ডেস্ট্রয় করেন না - অন্তর্নিহিত ফাইলটি পরিষ্কার করে দেয়, তবে পৃষ্ঠা মডেলটিতে চিত্র সম্পর্কিত মেটা তথ্য বজায় রাখে? তুমি কেন এটা করতে চাও? (এবং এমনটি মনে হয় না যা প্রশ্নকারী জিজ্ঞাসা করতে চায়)
জন বাচির

11
এই পদ্ধতিটি আমার পক্ষেও কাজ করেছিল ... তবে আমি একটি সমস্যার মুখোমুখি হয়েছি ... যদি ব্যবহারকারী চিত্র_ডিলিট চেকবক্সটি পরীক্ষা করে এবং একই সাথে ফর্মটিতে একটি নতুন চিত্র যুক্ত করে, তবে পুরানো চিত্রটি মুছে ফেলা হয় এবং নতুন চিত্রটি সংরক্ষণ করা হয় না । আমি অবস্থা পরিবর্তন করে এই মীমাংসিত self.image.clear if @image_delete == "1" and !image.dirty?মধ্যে destroy_image?পদ্ধতি
জিসান

97

has_attached_file :asset

=>

    attr_accessor :delete_asset
    before_validation { asset.clear if delete_asset == '1' }

সম্পদ ধ্বংস করার দরকার নেই, পেপারক্লিপ এটি করবে।

ফর্মের মধ্যে form.check_box(:delete_asset)যথেষ্ট হবে।


4
এটি কাজ করে এবং এটি @ ড্যানিম্যান উত্তর আইএমএইচওর চেয়ে সহজ। খুব ভালো! :)
ধাতুএলফ0

আপনি কিভাবে এই জন্য একটি বিশেষ লিখতে হবে?
হেনজি

4
ধন্যবাদ! এটিকে আরও কমিয়ে দেওয়ার জন্য আমাকে আরও সাহায্য করতে: has_attached_file :asset has_destroyable_file :asset আমি config/initializers/ gist.github.com/3954054
সানি

4
আমি এই পদ্ধতিটিতে কমপক্ষে গ্রহণযোগ্য_নস্টেড_ট্রিবিউটসের মাধ্যমে একটি সমস্যা পেয়েছি। অন্য কোনও বৈশিষ্ট্য পরিবর্তন না করা হলে নেস্টেড সেভের আগে_ বৈধকরণ ট্রিগার হবে না। সমাধানের জন্য নীচে আমার উত্তরটি দেখুন
পল ওডিয়ন

4
@SurgePedroza আমি বিশ্বাস করি আপনি প্যারামিটার অনুমতি প্রয়োজন: delete_asset দেখুন guides.rubyonrails.org/...
sman591

12

এটি বেনোইটের উত্তর, তবে একটি মডিউলটিতে আবৃত এবং নেস্টেড অ্যাট্রিবিউট মডেলগুলির প্রান্ত কেস কভার করা যেখানে মডেলটিতে ধ্বংস ডিক্স টিকবক্সই একমাত্র জিনিস পরিবর্তিত হয়।

এটি মডেলের সমস্ত সংযুক্তিতে প্রযোজ্য।

# This needs to be included after all has_attached_file statements in a class
module DeletableAttachment
  extend ActiveSupport::Concern

  included do
    attachment_definitions.keys.each do |name|

      attr_accessor :"delete_#{name}"

      before_validation { send(name).clear if send("delete_#{name}") == '1' }

      define_method :"delete_#{name}=" do |value|
        instance_variable_set :"@delete_#{name}", value
        send("#{name}_file_name_will_change!")
      end

    end
  end

end

4
কেন এটি আরও মনোযোগ দেয় নি জানেন না। attachment_definitionsশুধু আমার জীবন বাঁচিয়েছি।
OK56k

যদিও এই লাইনটি খুব দরকার:attr_accessible :"delete_#{name}"
OK56k

4
উপরের উদাহরণটি আপনার উদ্বেগ বা মডেল ফোল্ডারে থাকা উচিত। যে মডেলটি আপনি এটি চান সেখানে কেবল include DeletableAttachmentকোনও has_attached_fileবিবৃতি নীচের লাইনটি যুক্ত করুন
পল ওডিয়ন

4
রেল 3 এ আপনার দরকার হবে অ্যাট্রি_অ্যাক্সেসেবল: "মুছে ফেলুন _ # {নাম}"
মাতু

4
:delete_<your_attribute>আপনি যদি আপনার নিয়ামকটিতে শক্তিশালী পরামিতি ব্যবহার করেন তবে অনুমতি দেওয়ার কথা মনে রাখবেন
ivanxuu


1

রেলের 5 কাস্টম বৈশিষ্ট্যগুলি সমর্থন করার জন্য, পলের সমাধানের সংশোধিত সংস্করণ। আমি কেবল ইচ্ছে করে has_attached_fileসংজ্ঞা দেওয়ার আগে ফাইলের শীর্ষে মডিউলটি অন্তর্ভুক্ত করার কোনও উপায় থাকত ।

module Mixins
  module PaperclipRemover

    extend ActiveSupport::Concern

    included do
      attachment_definitions.keys.each do |name|

        attribute :"remove_#{name}", :boolean

        before_validation do
          self.send("#{name}=", nil) if send("remove_#{name}?")
        end

      end
    end

  end

end

0

কেবলমাত্র delete_attachmentমডেলের পাশে একটি প্রয়োগ করে কম কোড দিয়ে এটি অর্জন করতে সক্ষম হয়েছিল :

class MyModel < ApplicationRecord
  has_attached_file :image

  def image_delete=(other)
    self.image = nil if other == "1" or other == true
  end
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.