मुझे रूबी ऑन रेल्स में वर्तमान निरपेक्ष URL कैसे मिलेगा?


1053

मैं अपनी रूबी में रेल दृश्य पर वर्तमान निरपेक्ष URL कैसे प्राप्त कर सकता हूं ?

request.request_uriकेवल रिश्तेदार रिटर्न यूआरएल


आप रेल के लिए एक नज़र 4 कर सकते हैं: blog.grepruby.com/2015/04/absolute-url-full-url-in-rails-4.html
user3118220

जवाबों:


1443

रेल 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 से अनुरोध करता है।


31
अन्य उपयोगकर्ताओं के रूप में बताया गया है: चेतावनी चेतावनी: #request_uri का उपयोग किया जाता है। इसके बजाय फुलपाथ का उपयोग करें
गिलेडबू

9
@giladbu fullpathमें प्रोटोकॉल / डोमेन / पोर्ट शामिल नहीं है! यह एक पूर्ण URL नहीं है!
एलन एच।

37
"http://#{request.host+request.fullpath}"काम करेगा या अन्यथा, (यदि पोर्ट महत्वपूर्ण है)"http://#{request.host}:#{request.port+request.fullpath}"
Nilloc

7
यदि पोर्ट महत्वपूर्ण है, तो यह सही काम करता है: "http://#{request.host}:#{request.port}#{request.fullpath}"
सुक्रेनियर

3
क्या आप उस दावे के संदर्भ में इंगित कर सकते हैं जो request.urlपदावनत है? प्रस्तावित समाधान कहने का एक लंबा तरीका है जो request.urlपहले से ही करता है; कार्यान्वयन केवल प्रोटोकॉल है + host_with_port + fullpath ( github.com/rails/rails/blob/… )
mhartl

134

मुझे लगता है कि रूबी ऑन 3.0 विधि रूबी अब है request.fullpath


13
fullpath में डोमेन शामिल नहीं है
lulalala

मुझे खुशी है कि यह प्रदान किया गया क्योंकि मैं वास्तव में खोज कर रहा था कि डोमेन को कैसे शामिल नहीं किया जाए।
जेक

121

आप उपयोग कर सकते हैं url_for(only_path: false)


मेरे (थोड़ा विशेष मामले में) यह लगभग वही था जो मैं चाहता था। मैंने विकल्प को सही में बदल दिया और बिना विकल्प के, वर्तमान पृष्ठ के लिए url प्राप्त कर लिया। धन्यवाद :)
सर्पिलिस

@ दृश्य में नहीं है यह नहीं है। लेकिन यह वैसे भी वहाँ इस्तेमाल किया जाना चाहिए =)
शमशान टोडोरोव

मेरे मामले में मैं मेजबान नाम बदलना चाहता था, लेकिन बाकी सब कुछ रख दिया। मैंने पाया कि url_for (होस्ट: 'www.newdomain.com') ने समस्या के समाधान के रूप में मेरे लिए सबसे अच्छा काम किया। IMO, रेल के सभी संस्करणों में समान रूप से इसका अधिक मजबूत समाधान है।
पेप्पीहैपी

1
यदि आपके पास एक ही संसाधन के लिए कई रास्ते हैं तो FYI यह काम नहीं करेगा।
दकिंगफ्टथथ

68

चेतावनी चेतावनी: #request_uri का उपयोग करना पदावनत है । इसके बजाय फुलपैथ का उपयोग करें।


4
उत्तर stackoverflow.com/a/2165727/166279 पर नोट देखें , फ़ुलपैथ में डोमेन शामिल नहीं है।
निलोक

इस लाइन का उपयोग करते समय लिखने के समय लॉग से सीधे आया था request.uriऔर यह पहले से ही इस प्रश्न में कई बार इंगित किया गया है, लेकिन ... ठीक है, धन्यवाद
पारिस्थितिक

1
@ManishShrivastava: मज़ेदार, सभी "मूल" प्रयासों के बावजूद मैंने और अधिक जटिल सवालों के जवाब दिए, इस कॉपी और पेस्ट ने मुझे उच्चतम स्कोर दिया, अच्छी तरह से ... कुछ भी नहीं से बेहतर
पारिस्थितिक जीवन 27'14

61

यदि आप रेल 3.2 या रेल 4 का उपयोग कर रहे हैं, तो आपको request.original_urlवर्तमान URL प्राप्त करने के लिए उपयोग करना चाहिए ।


विधि के लिए दस्तावेज़ीकरण http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url पर है लेकिन यदि आप इसे लागू करने के लिए उत्सुक हैं:

def original_url
  base_url + original_fullpath
end

52

आप वर्तमान URL को वापस करने और अन्य मापदंडों में विलय करने की अनुमति देने के लिए ApplicationController में इस current_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

1
यह नियम 3.1 में परिभाषित नहीं किया गया है।
एलन एच।

1
आप इसे इस तरह से कर सकते हैंurl_for params.merge(:format => "PDF", :only_path => false)
montrealmike

2
यह भी कि अगर आप एक में हैं link_toतो बस उपयोग कर सकते हैं params.mergeऔर url_forपूरी तरह से छोड़ सकते हैं
montrealmike

36

रूबी के लिए रेल 3 पर:

request.url
request.host_with_port

मैंने एक डिबगर सत्र निकाल दिया और अनुरोध ऑब्जेक्ट को छोड़ दिया:

request.public_methods


28

मुझे एप्लिकेशन URL की आवश्यकता थी लेकिन उपनिर्देशिका के साथ। मैंनें इस्तेमाल किया:

root_url(:only_path => false)

27
 url_for(params)

और आप आसानी से कुछ नए पैरामीटर जोड़ सकते हैं:

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

5
यह स्वीकृत उत्तर की तुलना में कहीं अधिक सुरुचिपूर्ण (यदि कम दानेदार है)।
ओलिवियर लैकन

16

मुझे लगता है कि request.domain काम करेगा, लेकिन क्या होगा अगर आप blah.blah.com जैसी उप निर्देशिका में हैं? कुछ इस तरह काम कर सकता है:

<%= request.env["HTTP_HOST"] + page = "/" + request.path_parameters['controller'] + "/" + request.path_parameters['action'] %>

अपने पथ संरचना के आधार पर मापदंडों को बदलें।

उम्मीद है की वो मदद करदे!


8
हाँ Jaime का जवाब बेहतर है, लेकिन अगर आप वास्तव में अक्षम होना चाहते हैं, तो आप इसे मेरे तरीके से कर सकते हैं।
जेम्स एम

14

ऐसा लगता है जैसे request_uriरेल 3 पर रूबी में पदावनत किया गया है।

Using #request_uri is deprecated. Use fullpath instead.

13

रूबी 3.2.3-p194 और रूबी का उपयोग रेल 3.2.6 पर:

यदि request.fullpath आपके लिए काम नहीं करता है, तो request.env का प्रयास करें ["HTTP_REFERER"]

यहाँ नीचे मेरी कहानी है।

मुझे संचयी पृष्ठों के लिए वर्तमान URL (जो उसके ब्राउज़र में उपयोगकर्ता के लिए पता बार में दिखाया गया है) का पता लगाने के साथ इसी तरह की समस्या थी, जो विभिन्न नियंत्रकों से जानकारी को जोड़ती है, उदाहरण के लिए http://localhost:3002/users/1/history/issues,।

उपयोगकर्ता विभिन्न प्रकार की समस्याओं की सूची में स्विच कर सकता है। उन सभी सूचियों को अजाक्स के माध्यम से विभिन्न नियंत्रकों / भाग (बिना पुनः लोड किए) से लोड किया जाता है।

समस्या सूची के प्रत्येक आइटम में बैक बटन के लिए सही रास्ता निर्धारित करने की थी ताकि बैक बटन अपने स्वयं के पृष्ठ और संचयी पृष्ठ इतिहास दोनों में सही ढंग से काम कर सके ।

यदि मैं रिक्वेस्ट का उपयोग करता हूं। निफ्टपैथ , यह अंतिम जावास्क्रिप्ट अनुरोध का मार्ग देता है जो निश्चित रूप से वह 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

हाँ, fullpath आप यूआरएल आप का अनुरोध किया, नहीं यूआरएल आप हो जाता है से आया है जो मैं भी जरूरत है,। इसके लिए धन्यवाद!
स्पेंसर रथबुन

2
महान काम करता है, बस मुझे क्या चाहिए। यह एक अलग सवाल और जवाब में होना चाहिए, हालांकि। यहां पर ढूंढना मुश्किल है। : /
DDDD

12

रूबी 3.0 पर रूबी के लिए यह काम करता है और रूबी के अधिकांश संस्करणों को रीलों पर समर्थित होना चाहिए:

request.env['REQUEST_URI']

11

धागे में यहाँ किसी भी सुझाव ने मेरी मदद नहीं की, सिवाय एक के जहां किसी ने कहा कि उसने डिबगर का उपयोग किया जो वह ढूंढता था।

मैंने मानक 404 और 500 के बजाय कुछ कस्टम त्रुटि पृष्ठ बनाए हैं, लेकिन अपेक्षित के बजाय request.urlसमाप्त हो गया ।/404/non-existing-mumbo-jumbo

मुझे जो उपयोग करने की आवश्यकता थी वह था

request.original_url

9

यदि रिश्तेदार द्वारा, आप डोमेन के बिना मतलब है, तो देखो request.domain



8

आप रूबी विधि का उपयोग कर सकते हैं:

:root_url

बेस यूआरएल के साथ पूरा रास्ता मिलेगा:

localhost:3000/bla

यह एकमात्र समाधान है कि रेल 4 में active_model_serializers का उपयोग कर serializers में काम करता है
क्रिस खैरा

क्या आप मुझे बता सकते हैं कि जब मैं सोमथेलिन का उपयोग करता हूं :root_url, तो पूर्ण यूआरएल प्राप्त करने के लिए मैं उन परमपदों को कैसे प्रतिबंधित कर सकता हूं, जिन्हें मैं पूर्ण url में देता हूं ? मान लें कि मैं किसी तरह से यूथिन हूं some_method(:products_brand_url, brand: brand, entity_name: "brand")और some_methodइसे परिभाषित किया गया है कि 'डिम some_method (मार्ग, opts = {}) अंत `मैं अपने मार्ग की तरह नहीं देखना चाहता - http://localhost:3000/brands/brand_name?&entity_name="brand"। मैं चाहता हूं कि मार्ग जैसा दिखे http://localhost:3000/brands/brand_name। मैं सिर्फ entity_nameऑप्स हैश का हिस्सा बनना चाहता हूं न कि पूर्ण यूआरएल के लिए एक परम के रूप में।
बोधिसत्व

निश्चित रूप से वहाँ कोई रूबी विधि कहा जाता है root_url
शाम


6

आप रेल 3.2 के लिए किसी एक का उपयोग कर सकते हैं:

request.original_url
or
request.env["HTTP_REFERER"]
or
request.env['REQUEST_URI']

मुझे लगता है कि यह हर जगह काम करेगा

"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"

6

रेल्स 4.0

आप उपयोग कर सकते हैं request.original_url, आउटपुट उदाहरण के नीचे दिया जाएगा

get "/articles?page=2"

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

4

रेल 3.2 या रेल 4 के लिए बस इस तरह से "request.original_url" संदर्भ प्राप्त करें: मूल URL विधि

रेल के लिए 3 के रूप में request.url पदावनत है। हम सहमति देकर पूर्ण मार्ग प्राप्त कर सकते हैं

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

रेल के लिए २

request.url

3

यदि आप विशिष्ट होना चाहते हैं, तो इसका अर्थ है, आपको वह रास्ता पता है जिसकी आपको आवश्यकता है:

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


3
request.env["REQUEST_URI"]

रेल में काम करता है 2.3.4 परीक्षण किया और अन्य संस्करणों के बारे में पता नहीं है।


3

बिना किसी क्वेरी पैरामीटर के अनुरोध URL प्राप्त करने के लिए।

def current_url_without_parameters
  request.base_url + request.path
end

3

आप या तो उपयोग कर सकते हैं

request.original_url 

या

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

वर्तमान URL प्राप्त करने के लिए।


1

आप उपयोग कर सकते हैं:

request.full_path

या

request.url

उम्मीद है कि यह आपकी समस्या का समाधान करेगा।

चियर्स


1

आप इसके लिए एक चर सेट कर सकते हैं URI.parse(current_url), मुझे यह प्रस्ताव अभी तक नहीं दिख रहा है और यह मेरे लिए काम करता है।


0

निरपेक्ष URL प्राप्त करने के लिए जिसका अर्थ है कि from the rootइसे इस तरह प्रदर्शित किया जा सकता है

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

Users_url सहायक एक URL बनाता है जिसमें प्रोटोकॉल और होस्ट नाम शामिल हैं। उपयोगकर्ता_पथ सहायक केवल पथ भाग उत्पन्न करता है।

users_url: http://localhost/users
users_path: /users
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.