2011-01-17 15 views
42

रेलवे 3 का उपयोग करके सहायक लिंक_to देखें, मॉडल के अंदर link_to सहायक, या उस मामले के लिए किसी भी सहायक का उपयोग करने का कोई तरीका है?मॉडल वर्ग

उत्तर

74

कुछ कारण हैं कि आपको मॉडल में link_to की आवश्यकता हो सकती है। हां, @andy, यह एमवीसी का उल्लंघन है, लेकिन इसका मतलब यह नहीं है कि आपको प्रश्न का जवाब न देने के लिए अंक प्राप्त करना चाहिए।

@schwabsauce, यह है कि तुलना में आसान है। यदि आप प्रारंभकर्ता या कुछ में करते हैं तो पहली पंक्ति भी सख्ती से जरूरी नहीं है। समान चीज़ .sanitize और .raw और अन्य भयानक कार्यों का पूरा भार के लिए काम करती है।

ActionView::Base.send(:include, Rails.application.routes.url_helpers) 
ActionController::Base.helpers.link_to(whatever) 

आप autopaths उपयोग करने के लिए आप अपने LINK_TO अंदर यह करने के लिए हो सकता है चाहते हैं:

Rails.application.routes.url_helpers.page_path(@page) 
+0

इस सवाल को कुछ समय पहले पूछा गया था और उस समय @ एंडी की सलाह ने मुझे इस समस्या को हल करने में मदद की। हालांकि, आप एक ऐसे अर्थ में सही हैं जो वास्तविक प्रश्न का उत्तर नहीं देता है। – Krule

-6

हैकर के बिना नहीं।

यदि आपको लगता है कि आपको मॉडल में link_to की आवश्यकता है, तो आप शायद Model-View-Controller architecture के कुछ सिद्धांतों का उल्लंघन कर रहे हैं।

एक मॉडल डेटा और व्यवसाय तर्क के लिए एक जगह होना चाहिए, लेकिन लिंक पैदा लगभग निश्चित रूप से नियंत्रक या देखने के लिए एक नौकरी है (या, विशेष रूप से रेल, एक सहायक वर्ग में)।

include ActionView::Helpers::UrlHelper 
include ActionController::UrlFor 
include Rails.application.routes.url_helpers 

cattr_accessor :controller 
def controller; self.class.controller; end 
def request; controller.request; end 

तब मेरे नियंत्रक में मैं विशेषता आबादी (खरोंच से एक नियंत्रक बनाने हैश बहस में डेटा की एक महत्वपूर्ण राशि की आवश्यकता है):

+1

धन्यवाद। सहायक देखने के लिए चीजों को हटाया। सब अभी ठीक है। – Krule

+18

मॉडल में मददगारों का उपयोग करने के अच्छे कारण हैं। लेकिन इस बिंदु पर, यदि आप एक राय देने जा रहे हैं तो कम से कम एक समाधान प्रदान करें यदि उन्होंने इसे सोचा है। यह संभव है कि 2k प्रतिनिधि वाले किसी व्यक्ति के पास सीधे सिर हो। –

5

मैं इस निम्नलिखित समावेशन के साथ काम मिल गया।

Lead.controller = self 
+1

fwiw, रेल दस्तावेज इस समाधान के लिए रास्ता का नेतृत्व करता है। एक्शनडिस्पाच :: रूटिंग :: UrlFor के लिए दस्तावेज़ बताते हैं कि "युक्ति: यदि आपको अपने मॉडल या किसी अन्य स्थान से यूआरएल उत्पन्न करने की आवश्यकता है, तो एक्शनकंट्रोलर :: UrlFor वह है जिसे आप ढूंढ रहे हैं।" फिर जब आप उस फ़ाइल को एक त्रुटि संदेश के रूप में ऑफ़र करते हैं: उठाएं "#url_for का उपयोग करने के लिए, आपको रूटिंग हेल्पर्स को स्पष्ट रूप से शामिल करना होगा।" "उदाहरण के लिए, 'Rails.application.routes.url_helpers" तो मुझे लगता है रेल सम्मेलनों द्वारा स्वीकार्य है - कभी-कभी लिंक बनाने के लिए यह सबसे अच्छा तरीका/सर्वोत्तम स्थान है :) – schwabsauce

+0

हां, उदाहरण के लिए, यदि आपका मॉडल किसी तृतीय पक्ष को भुगतान प्राधिकरण को प्रबंधित कर रहा है, ऑफसाइट गेटवे, और वापसी/रद्द URL उत्पन्न करने की आवश्यकता है ऐप पर वापस। – hoffmanc

30

बहुत सावधान रहो चक की पोस्ट में उल्लिखित अगर आप रेल 3.2 में यह कर रहे हैं सलाह के बाद। 1। ऐसा प्रतीत होता है कि रेलवे 3.2.1 में गैर-दृश्य वर्गों में लिंक_to सहायक सहित लिंक को सुरक्षित करने का एक सुरक्षित तरीका नहीं है। नीचे उल्लिखित एक सुरक्षित तरीका है (जो किसी भी मामले में हमारे लिए काम करता है)।

हम अपने वर्गों में से एक में चक की पोस्ट में दृष्टिकोण का इस्तेमाल किया, यह बहुत परेशान और डिबग परिणामों के लिए मुश्किल होने समाप्त हो गया। यह साइड इफेक्ट्स/बग का कारण बन गया जो केवल बहुत विशिष्ट (और दुर्लभ) परिस्थितियों में बदल गया।

ActionView::Base.send(:include, Rails.application.routes.url_helpers) 

ActionView::Base कह रहा है Rails.application.routes.url_helpers, जो ActionView::Base जाहिरा तौर पर पहले से ही अपने आप ही करता है शामिल करने के लिए:

समस्या, जहाँ तक हम बता सकते हैं, कि इस लाइन है। इसमें url_helpers दूसरी बार शामिल है, ऐसा लगता है कि मार्ग राज्य के पुन: प्रारंभिकरण (कक्षाओं में @_routes जिनमें एक्शनडिस्चैच :: रूटिंग :: UrlFor मॉड्यूल शामिल है)। अपवाद बार देखा गया है कि, कॉल करने का प्रयास प्रत्यक्ष या परोक्ष रूप में, url_for विधि ActionView::Base के बाद url_helpers दूसरी बार शामिल किया गया है:

यह मालूम होता है यादृच्छिक और अस्पष्टीकृत "NilClass अपरिभाषित विधि 'url_for' शून्य के लिए" की ओर जाता है।

हमारे लिए काम किया गया समाधान ActionView::Base को url_helpers दोबारा शामिल करने के बजाय, UrlHelper मॉड्यूल को कहीं भी शामिल करें, जहां कहीं भी आपको इसकी आवश्यकता हो।

फिर जब आप LINK_TO का उपयोग करें और आप बस कर सकते हैं इस (यह मानते हुए login_path अपने अनुप्रयोग के लिए मान्य है) पथ का उपयोग करने की जरूरत है:

include ActionView::Helpers::UrlHelper 
... 
link = link_to('here', Rails.application.routes.url_helpers.login_path) 

यह हमें एक बहुत लंबे समय है और काफी एक बहुत ले लिया डबल-इन के कारण होने वाली बग को ट्रैक करने के लिए सिर स्क्रैचिंग का और मैं बस दूसरों को चेतावनी देना चाहता था कि रेल बेस कक्षाओं के व्यवहार को ट्विक करते समय सावधान रहें।

+0

इसे साझा करने के लिए धन्यवाद! मुझे खुशी है कि आपको एक बेहतर तरीका मिला! –

+1

एक-लाइनर: 'एक्शन व्यू :: हेल्पर्स :: UrlHelper' – karlingen

+0

@karlingen - 'Rails.application.routes ... के संदर्भ को छोड़कर" संदेश को जन्म दे सकता है "url_ को पास किए गए तर्कों को संभाला नहीं जा सकता है। कृपया मार्गों की आवश्यकता है या अपना खुद का कार्यान्वयन प्रदान करें " – Del

2

LINK_TO सहायक, MVC उल्लंघन

क्या एंडी ने कहा,

आप मॉडल आप शायद पर एक बड़ा लंबे नज़र रखना करने की आवश्यकता में HTML पैदा कर रहे हैं तो आप क्या कर रहे हैं और क्यों।

यूआरएल सहायकों दूसरी ओर

URL में अक्सर/... यहां तक ​​कि मॉडल में, उदाहरण के लिए कक्षाएं, सेवा/प्रपत्र/एपीआई के सभी प्रकार में दृश्य-नियंत्रक कोड के काम के बाहर में आते हैं, यदि आप यह करना है।

हाँ, Rails.application.routes.url_helpers एक मॉड्यूल है, लेकिन इसका मतलब यह नहीं है कि आप बस इसे शामिल करना चाहिए जहाँ भी या हास्यास्पद सामान हो रहा शुरू कर देंगे के रूप में गैरी डाल दिया:

https://www.destroyallsoftware.com/blog/2011/one-base-class-to-rule-them-all

क्या आप क्या कर सकते हैं:

delegate :url_helpers, :to => 'Rails.application.routes' 

और उसके बाद का उपयोग, उदाहरण के लिए

url_helpers.home_url 
संबंधित मुद्दे