كيف يمكنني الحصول على عنوان URL الأساسي (على سبيل المثال http: // localhost: 3000) من تطبيق القضبان الخاص بي؟

StackOverflow https://stackoverflow.com/questions/1510318

سؤال

أنا أستخدم PaperClip للسماح للمستخدمين بإرفاق الأشياء، ثم أرسل رسالة بريد إلكتروني ورغب في إرفاق الملف إلى البريد الإلكتروني. أحاول قراءة الملف وإضافته كمرفق، مثل ذلك:

# models/touchpoint_mailer.rb
class TouchpointMailer < ActionMailer::Base
  def notification_email(touchpoint)
    recipients "me@myemail.com"
    from "Touchpoint Customer Portal <portal@touchpointclients.com>"
    content_type "multipart/alternative"
    subject "New Touchpoint Request"
    sent_on Time.now
    body :touchpoint => touchpoint

    # Add any attachments the user has included
    touchpoint.assets.each do |asset|
      attachment :content_type => asset.file_content_type,
                 :body => File.read(asset.url)
    end
  end
end

هذا يعطيني الخطأ التالي No such file or directory - /system/files/7/original/image.png?1254497688 مع تتبع المكدس قائلا إنها الدعوة إلى File.read. وبعد عندما أزور show.html.erb الصفحة، وانقر على الرابط إلى الصورة، وهو شيء مثل http://localhost:3000/system/files/7/original/image.png?1254497688, ، يتم عرض الصورة بشكل جيد.

كيف يمكنني حل هذه المشكلة؟

هل كانت مفيدة؟

المحلول

asset.url إرجاع عنوان URL إلى الملف. هذا عادة /system/classname/xx/xx/style/filename.ext. وبعد كنت وضعت هذا في image_tag.

انت تريد asset.path. وبعد إنه بإرجاع المسار الكامل إلى الملف، والذي سيكون عادة شيء مثل /home/username/railsapp/public/system/classname/xx/xx/style/filename.ext

هث.

نصائح أخرى

عادة root_url يجب أن توفر هذا.

File.Read يتوقع مسار الملفات، وليس عنوان URL رغم ذلك. إذا كنت تقوم بتوليد الصور، فيجب عليك استدعاء رمز إنشاء الصورة وإرجاع البايتات من الصورة التي تم إنشاؤها بدلا من الاتصال File.read(…)

request.env["HTTP_HOST"]

لا أعرف لماذا هذا سطر واحد من التعليمات البرمجية بعيد المنال على الويب. يبدو أنه يجب أن يكون الأمام والوسط.

كما يقول Ziggythehamster: The Asset.url هو عنوان URL الذي تم إنشاؤه على صفحات الويب (وهذا هو السبب في أنك تحصل على مخلوط دليل على طراز UNIX، كما هو مذكور في التعليقات.)

يجب أن يمنحك Asset.Path مسار OS-Aware بالملف، ولكن حتى ذلك ليس مطلوبا مع PaperClip.PaperClip :: مرفق هو بالفعل IOStream.

تحتاج فقط :body => asset مثل ذلك:

touchpoint.assets.each do |asset|
  attachment :content_type => asset.file_content_type,
             :body => asset
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top