كيف يمكنني الحصول على عنوان URL المطلق الحالي في Ruby on Rails؟




ruby-on-rails (20)

كيف يمكنني الحصول على عنوان URL المطلق الحالي في عرض Ruby on Rails؟

يعرض request.request_uri فقط عنوان URL النسبي.


للقضبان 3.2 أو القضبان 4+

يجب عليك استخدام request.original_url للحصول على عنوان URL الحالي.

تم توثيق هذه الطريقة بالطريقة original_url ، ولكن إذا كنت فضوليًا ، يكون التنفيذ:

def original_url
  base_url + original_fullpath
end

للقضبان 3:

يمكنك كتابة "#{request.protocol}#{request.host_with_port}#{request.fullpath}" ، نظرًا لأن request.url تم الآن إهمالها.

للقضبان 2:

يمكنك كتابة request.url بدلاً من request.request_uri . هذا يدمج البروتوكول (عادةً http: //) مع المضيف ، و request_uri لتعطيك العنوان الكامل.


أحتاج إلى URL للتطبيق ولكن في الدليل الفرعي. إستعملت:

root_url(:only_path => false)

أعتقد أن طريقة Ruby on Rails 3.0 هي الآن request.fullpath .


إذا كنت تريد أن تكون محددًا ، يعني ذلك أنك تعرف المسار الذي تحتاج إليه:

link_to current_path(@resource, :only_path => false), current_path(@resource)

إذا كنت تقريبًا ، فإنك تعني فقط دون النطاق ، ثم ابحث في request.domain .


باستخدام Ruby 1.9.3-p194 و Ruby on Rails 3.2.6:

إذا كان request.fullpath لا يعمل من أجلك ، فحاول request.env ["HTTP_REFERER"]

وهنا قصتي أدناه.

لقد واجهت مشكلة مماثلة في اكتشاف عنوان URL الحالي (الذي يظهر في شريط العناوين للمستخدم في متصفحها) للصفحات التراكمية التي تجمع المعلومات من وحدات التحكم المختلفة ، على سبيل المثال ، http://localhost:3002/users/1/history/issues .

يمكن للمستخدم التبديل إلى قوائم مختلفة من أنواع القضايا. يتم تحميل جميع هذه القوائم عبر Ajax من وحدات تحكم / جزئية مختلفة (بدون إعادة التحميل).

كانت المشكلة هي تعيين المسار الصحيح للزر الخلفي في كل عنصر من القائمة بحيث يمكن أن يعمل زر الرجوع بشكل صحيح في صفحته الخاصة وفي سجل الصفحات التراكمي.

في حالة استخدام request.fullpath ، يتم عرض مسار طلب جافا سكريبت الأخير وهو بالتأكيد ليس عنوان URL الذي أبحث عنه.

لذلك استخدمت request.env ["HTTP_REFERER"] الذي يخزن عنوان URL للطلب الأخير الذي تم إعادة تحميله .

وهنا مقتطفات من الجزئية لاتخاذ قرار

- if request.env["HTTP_REFERER"].to_s.scan("history").length > 0
  - back_url = user_history_issue_path(@user, list: "needed_type")
- else
  - back_url = user_needed_type_issue_path(@user)
- remote ||= false
=link_to t("static.back"), back_url, :remote => remote


ساعدني أي من الاقتراحات هنا في الموضوع ، للأسف ، باستثناء واحد حيث قال أحدهم أنه استخدم مصحح الأخطاء للعثور على ما كان يبحث عنه.

لقد أنشأت بعض صفحات الخطأ المخصصة بدلاً من المعيارين 404 و 500 ، لكن request.url انتهى في /404 بدلاً من /non-existing-mumbo-jumbo المتوقع /non-existing-mumbo-jumbo .

ما كنت بحاجة لاستخدام كان

request.original_url

في Ruby on Rails 3.1.0.rc4:

 request.fullpath

للحصول على عنوان URL المطلق والذي يعني أنه from the root يمكن عرضه على هذا النحو

<%= link_to 'Edit', edit_user_url(user) %>

يقوم المساعد user_url بإنشاء عنوان URL يتضمن البروتوكول واسم المضيف. يقوم المساعد user_path بإنشاء جزء المسار فقط.

users_url: http://localhost/users
users_path: /users

للقضبان 3:

request.fullpath


هذا يعمل لـ Ruby on Rails 3.0 ويجب أن يدعمه معظم إصدارات Ruby on Rails:

request.env['REQUEST_URI']

يمكنك إضافة هذه الطريقة current_url في ApplicationController لإرجاع عنوان URL الحالي والسماح بالدمج في معلمات أخرى

# https://x.com/y/1?page=1 
# + current_url( :page => 3 )
# = https://x.com/y/1?page=3
def current_url(overwrite={})
    url_for :only_path => false, :params => params.merge(overwrite)
end

مثال للاستخدام:

current_url --> http://...
current_url(:page=>4) --> http://...&page=4

يمكنك استخدام url_for(:only_path => false)


يمكنك استخدام إما

request.original_url 

أو

"#{request.protocol}#{request.host_with_port}" 

للحصول على عنوان URL الحالي.


يمكنك استخدام طريقة روبي:

:root_url

والتي ستحصل على المسار الكامل باستخدام عنوان url الأساسي:

localhost:3000/bla

يمكنك تعيين متغير على URI.parse(current_url) ، لا أرى هذا الاقتراح هنا حتى الآن ويعمل لي.


القضبان 4.0

يمكنك استخدام request.original_url ، سيكون الناتج كما هو موضح أدناه

get "/articles?page=2"

request.original_url # => "http://www.example.com/articles?page=2"

 url_for(params)

ويمكنك إضافة معلمة جديدة بسهولة:

url_for(params.merge(:tag => "lol"))

(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)






url