2015-02-14 7 views
7

में पहचाना नहीं गया है मेरे रेल आवेदन में मेरे पास एक टीम मॉडल है। टीमों के लिए मेरे route.rb फ़ाइल इस तरह दिखता है:रेल मार्ग सहायक मॉडल मॉडल

resources :teams 

मेरी teams_controller.rb में लाइन team_path(Team.first.id) काम करता है लेकिन team_path यूआरएल सहायक अपने मॉडल team.rb. में मान्यता प्राप्त नहीं है फ़ाइल

undefined local variable or method `team_path' for # <Class:0x00000101705e98> 
from /usr/local/rvm/gems/ruby-1.9.3-p392/gems/activerecord-4.1.1/lib/active_record/dynamic_matchers.rb:26:in `method_missing' 

मैं मॉडल team_path पथ सहायक को मान्यता देने का रास्ता खोजने की जरूरत है: मैं इस त्रुटि संदेश मिलता है।

+1

मुझे लगता है कि आप अपने मॉडल में सहायकों का उपयोग कर से बचने के लिए किया है। हेल्पर्स विचारों और नियंत्रकों में उपयोगी हैं। वैसे भी, त्रुटि संदेश क्या है और आप सहायक का उपयोग कैसे कर रहे हैं? –

+0

वे आमतौर पर केवल विचारों और नियंत्रकों में सहायक होते हैं लेकिन इस विशेष मामले के लिए मुझे अपने मॉडल में पथ सहायक की आवश्यकता होती है। मुझे यह त्रुटि 'अपरिभाषित स्थानीय चर या विधि' team_path '# <कक्षा: 0x00000101705e98> /usr/local/rvm/gems/ruby-1.9.3-p392/gems/activerecord-4.1.1/lib/active_record से प्राप्त होती है /dynamic_matchers.rb:26:in 'method_missing'' – user3266824

उत्तर

12

आप url_helpers इस तरह से कॉल करने के लिए सक्षम होना चाहिए:

Rails.application.routes.url_helpers.team_path(Team.first.id) 
+2

यह निश्चित रूप से "रेल मार्ग" नहीं है।" –

+1

मॉडलों के लिए अपने स्वयं के स्थान, यानी यूआरएल जानने के लिए जिम्मेदार होना बिल्कुल सही है। सीएमएस से संबंधित मॉडल जैसे 'पेज',' आलेख 'इत्यादि के लिए सचमुच सच है, लेकिन यूआरएल के साथ किसी भी मॉडल के लिए यह ठीक है। –

+0

उस इलियट के लिए धन्यवाद। मैं आपके अच्छे फैसले को रोकूंगा और तदनुसार अपना जवाब संपादित करूंगा। – trosborn

-1

मॉडल पथ, रीडायरेक्ट या किसी भी सामान जैसी चीज़ों से निपटने के लिए नहीं माना जाता है। वे चीजें पूरी तरह से दृश्य या नियंत्रक के निर्माण हैं।

मॉडल वास्तव में बस होना चाहिए; आप जो चीज बना रहे हैं उसका एक मॉडल। इसे पूरी तरह से इस बात का वर्णन करना चाहिए, आपको इसके उदाहरण ढूंढने, इसमें बदलाव करने, इसके सत्यापन करने की अनुमति मिलती है ... लेकिन उस मॉडल के बारे में कोई विचार नहीं होगा कि किसी भी चीज़ के लिए किस मार्ग का उपयोग किया जाना चाहिए।

रेल दुनिया में एक आम बात यह है कि अगर आपको कुछ करना मुश्किल लगता है (जैसे मॉडल से पथ सहायक को कॉल करना) तो आप इसे गलत तरीके से कर रहे हैं। इसका मतलब यह है कि कुछ भी संभव है, भले ही रेल में करना मुश्किल हो, तो संभवतः ऐसा करने का सबसे अच्छा तरीका नहीं है।

+1

मैं एक टीम के अन्य विशेषताओं के साथ एक जेसन स्ट्रिंग में विभिन्न टीमों के एकाधिक पथ स्टोर करने की कोशिश कर रहा हूं और उन्हें एक टूलटिप पर प्रस्तुत किया गया है जब एक निश्चित HTML तत्व पर लगाया जा रहा है । तो यह एक सामान्य रीडायरेक्ट स्थिति नहीं है। मैंने अपने मॉडल में एक विधि बनाई है जो इस जेसन स्ट्रिंग को मेरे सभी विशेषताओं के साथ बनाता है। लिंक ऐसा कुछ है जिसे मैंने अभी सोचा था और मुझे यकीन नहीं है कि नियंत्रक में बहुत अधिक तर्क डाले बिना मैं इस तर्क को नियंत्रक में कैसे कार्यान्वित करूंगा। यह सिर्फ मुझे मॉडल में लाने के लिए सबसे अधिक समझ में आता है। – user3266824

+0

मुझे डाउनवॉट्स नहीं समझते हैं। मैं बुरी प्रथाओं को प्रोत्साहित करने वाले रेलों से थक गया हूं। – Papipo

7

इस as suggested in the Rails API docs for ActionDispatch::Routing::UrlFor को सुलझाने पर विचार करें: सवाल से Team मॉडल के मामले में

# This generates, among other things, the method <tt>users_path</tt>. By default, 
# this method is accessible from your controllers, views and mailers. If you need 
# to access this auto-generated method from other places (such as a model), then 
# you can do that by including Rails.application.routes.url_helpers in your class: 
# 
# class User < ActiveRecord::Base 
#  include Rails.application.routes.url_helpers 
# 
#  def base_uri 
#  user_path(self) 
#  end 
# end 
# 
# User.find(1).base_uri # => "https://stackoverflow.com/users/1" 

, इस प्रयास करें:

# app/models/team.rb 
class Team < ActiveRecord::Base 
    include Rails.application.routes.url_helpers 

    def base_uri 
    team_path(self) 
    end 
end 

यहां एक वैकल्पिक तकनीक है जिसे मैं पसंद करता हूं क्योंकि यह मॉडल के लिए कम तरीकों को जोड़ता है।

include से बचें और इसके बजाय routes वस्तु से url_helpers का उपयोग करें:

class Team < ActiveRecord::Base 

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

    def base_uri 
    url_helpers.team_path(self) 
    end 
end 
संबंधित मुद्दे