2013-08-29 4 views
12

हम this post से जानते हैं, रेल में, आप पिछले यूआरएलआप कैसे निर्धारित करते हैं कि request.referrer रेल के आराम से पथ से मेल खाता है?

request.referrer 

फोन करके प्राप्त कर सकते हैं लेकिन अगर पिछले यूआरएल अपने रेल आवेदन में शोकहारा पथ में से एक से मेल खाता है आप कैसे की जाँच करते हैं?

शोकहारा रास्तों से, मैं जैसे,

books_path 
book_path(book) 
edit_book_path(book) 

रेल द्वारा प्रदान की पथ, बेशक मैं request.referrer पर एक नियमित अभिव्यक्ति स्ट्रिंग मैच कर सकते हैं मतलब है, लेकिन मुझे लगता है यह थोड़ा बदसूरत है।

एक विशेष मामला है, अपने आवेदन में, यह है कि request.referrer हो सकता है? "स्थानीय होस्ट: 3000/पुस्तकों पेज = 4"

और मैं

books_path 

मैच के लिए यह करना चाहते हैं जो रिटर्न "/ किताबें"

इस मामले में, मैं नियमित अभिव्यक्ति स्ट्रिंग मिलान किए बिना कोई मिलान कैसे कर सकता हूं या नहीं? (यदि यह संभव है)

धन्यवाद

पीएस मैंने नियमित अभिव्यक्ति स्ट्रिंग मैच की कोशिश की है, और यह काम करता है। मैंने सोचा कि रेल में बेहतर तरीका हो सकता है।

+0

आप क्यों नहीं बस संदर्भदाता के डोमेन भाग की जाँच नहीं कर सकते हैं कि यह एक आंतरिक/बाह्य यूआरएल से आ रहा है देखने के लिए:

get 'foo/bar' => 'foo#bar', as: :foo_bar 

तो फिर तुम इस तरह की जांच कर सकता है? यदि आंतरिक है, तो यह आपके ऐप में परिभाषित एक मार्ग होगा, यदि नहीं, तो यह नहीं होगा। – varatis

+0

@varatis, मुझे नहीं लगता कि आप मेरे प्रश्न को समझ गए हैं।यूआरएल के डोमेन की जांच करना बहुत आसान है। मैं जानना चाहता हूं कि यह पिछला यूआरएल किताबों के "इंडेक्स" पथ से मेल खाता है (मेरे उदाहरण में)। मैं रेगेक्स तुलना किए बिना ऐसा कैसे करूं? –

+0

यदि आप केवल एक पथ को देख रहे हैं, तो ऐसा लगता है कि रेगेक्स या स्ट्रिंग तुलना का उपयोग करना सबसे आसान होगा। – varatis

उत्तर

16

आप का उपयोग request.referer के रास्ते भाग निकाल सकते हैं:

URI(request.referer).path 

फिर आप की जाँच करने के Rails.application.routes.recognize_path उपयोग कर सकते हैं पथ एक नियंत्रक और कार्रवाई, जैसे करने के लिए नक्शे:

my_path = URI(request.referer).path 
# => /books 

Rails.application.routes.recognize_path(my_path) 
# => {:action=>"show", :controller=>"books", :page=>"4"} 
+1

चेतावनी: 'पहचान_पथ' विधि बहिष्कृत है। – sealocal

+4

ठीक है। एक विकल्प के लिए कोई सुझाव? – gitb

2

हालांकि आप इसके साथ क्या करना चाहते हैं, इसके बारे में निश्चित नहीं है, लेकिन निश्चित रूप से रेलवे रीडायरेक्ट को नियंत्रित करने के बेहतर तरीकों का समर्थन करती हैं। फिर भी, मैं इस लगता है आप के लिए क्या देख रहे:

request.referer == books_url(page: params[:page])

UPDATED:

इस तरह, भले ही वहाँ कोई पैरामीटर [: पेज]। यह अभी भी ठीक से काम करेगा।

+0

उत्तर के लिए धन्यवाद। हालांकि, पृष्ठ 4 केवल एक उदाहरण है, यह पृष्ठ 7 हो सकता है, या इसमें पृष्ठ परम नहीं हो सकता है। यहां स्पष्ट रूप से हार्ड-कोडिंग पेज 4 है जो मैं चाहता हूं। –

+0

मुझे लगा कि, लेकिन यह भी एक उदाहरण था। आप 'request.referer == books_url (पृष्ठ: पैराम्स [: पृष्ठ]) 'का उपयोग कर सकते हैं, इस तरह, यहां तक ​​कि यदि कोई पैराम नहीं है [: पृष्ठ] यह इरादे के रूप में काम करेगा। कोशिश करो। –

0

के बाद से recognize_path को बहिष्कृत किया गया था, यह करने का यह एक और तरीका है:

का उपयोग करके अपने मार्ग कॉन्फ़िगरेशन में अपना मार्ग नाम देंकीवर्ड:

if URI(request.referer).path == foo_bar_path 
    do_something() 
end 
संबंधित मुद्दे