كيف يمكنني الحصول على عنوان URL الأساسي (على سبيل المثال http: // localhost: 3000) من تطبيق القضبان الخاص بي؟
-
19-09-2019 - |
سؤال
أنا أستخدم 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