2011-02-11 10 views
7

में to_param को ओवरराइड करते समय मार्गों के साथ त्रुटि, जब मैं आईडी के रूप में ईमेल पते का उपयोग करने के लिए अपने उपयोगकर्ता मॉडल में to_param को ओवरराइड करने का प्रयास करता हूं तो मुझे अपने मार्गों में त्रुटि मिल रही है। ऐसा लगता है कि जब वह मार्ग से मिलान करने की कोशिश करता है तो आईडी के लिए पूरी ऑब्जेक्ट से मिलान करने का प्रयास किया जा रहा है। क्या कोई मुझे यह जानने में मदद कर सकता है कि मैं क्या खो रहा हूं?रेल 3.0: मॉडल

यहाँ त्रुटि है:

No route matches {:controller=>"users", :action=>"show", :id=>#<User id: 1, email: ....>} 

यहाँ कैसे मैं कोड सेट अप किया है।

मॉडल/user.rb:

attr_accessible :email  

def to_param 
    email 
end 

नियंत्रकों/users_controller.rb:

before_filter :get_user, :only=>[:show,:update,:edit,:destroy] 

... 

def get_user 
    @user = User.find_by_email params[:id] 
end 

config/routes.rb

resources :users 

और यहाँ रेक मार्गों से उत्पादन है:

 user GET /users(.:format)   {:controller=>"users", :action=>"index"} 
      POST /users(.:format)   {:controller=>"users", :action=>"create"} 
new_user GET /users/new(.:format)  {:controller=>"users", :action=>"new"} 
edit_user GET /users/:id/edit(.:format) {:controller=>"users", :action=>"edit"} 
    user GET /users/:id(.:format)  {:controller=>"users", :action=>"show"} 
      PUT /users/:id(.:format)  {:controller=>"users", :action=>"update"} 
      DELETE /users/:id(.:format)  {:controller=>"users", :action=>"destroy"} 
+0

आप लिंक है, जो, इस त्रुटि की ओर जाता है कृपया दिखा।आपका सभी कोड सही है, इसलिए आपके लिंक – fl00r

+0

में त्रुटि है समस्या समस्या को दिखाने, संपादित करने, अपडेट करने और नष्ट करने में है। तो या तो ब्राउज़र में पथ (/users/[email protected], या दृश्य में link_to को कॉल करने की कोशिश कर रहे हैं, जैसे <% = link_to "दिखाएँ", उपयोगकर्ता%>, या <% = link_to "संपादित करें" , edit_user_path (उपयोगकर्ता)%> – Bee

उत्तर

5

समस्या यह है कि ईमेल '।' जोड़ता है (डॉट) यूआरएल में है, और यह रेल को भ्रमित करता है, क्योंकि यह "कॉम" प्रारूप (यदि ईमेल .com में समाप्त होता है) को खोजने का प्रयास करता है

मैंने यह कोड अपने ऐप्स में से एक में जोड़ा है (मेरे पास लोग हैं उपयोगकर्ताओं के बजाए) और यह ठीक से काम करता है, इसलिए चाल किसी अन्य चीज़ के साथ डॉट को प्रतिस्थापित करना है। मैंने इसे '@' के साथ बदलना चुना क्योंकि अन्य प्रतीकों जैसे - या + ईमेल पते में मान्य हैं।

फ़ाइल person.rb

def to_param 
    email.sub ".", "@" 
end 

def self.param_to_email(param) 
    segments = param.split '@' 
    host = segments[1..-1].join('.') 
    segments[0] + '@' + host 
end 

फ़ाइल people_controller.rb

def get_person 
    email = Person.param_to_email params[:id] 
    @person = Person.find_by_email email 
end 

यह कैसे http://jroller.com/obie/entry/seo_optimization_of_urls_in में काम करता है के बारे में कुछ और संकेत कर रहे हैं।

प्रश्न के लिए धन्यवाद, मैं सिर्फ रेल के साथ शुरू कर रहा हूं, इसलिए यह वास्तव में यह समझने में मेरी सहायता कर रहा है कि यह कैसे काम करता है :)।

+0

धन्यवाद, अगस्तो! ब्लॉग पोस्ट ने मुझे to_param स्थिति को थोड़ा बेहतर समझने में मदद की। फिर भी, मुझे लगता है कि यहां कुछ और चल रहा है .. मेरे नियंत्रक में मैं उपयोगकर्ता को खोजने के लिए find_by_email का उपयोग कर रहा हूं पैरामीटर, उपयोगकर्ता की बजाय। फाइंड। ऐसा लगता है कि केवल रूट में ईमेल का उपयोग करने में समस्या है। मैंने उपयोगकर्ता मॉडल में 'नाम' फ़ील्ड बस परीक्षण करने के लिए जोड़ा है, और यह to_param को ओवरराइड करने के लिए ठीक काम करता है : नाम विशेषता, लेकिन ईमेल अभी भी विफल रहता है, जिसमें मैं आपके सुझाव के अनुसार आईडी को पूर्ववत करता हूं। कोई विचार क्यों ईमेल विशेष रूप से विफल रहता है? – Bee

+0

मुझे समस्या मिली। कृपया उत्तर – Augusto

+0

उत्तर दोबारा जांचें, हाँ, मैं त्रुटि आउटपुट में देखता हूं यह पैरामीटर दिखाता है कि यह इस प्रारूप तर्क में '.com' भाग को पार्स कर रहा है। था मदद के लिए nks यह पता लगाने! – Bee

2

आप डॉट्स 'शामिल कर सकते हैं।' अपने to_param वापसी मान में आप अपने मार्ग में 'आईडी' पैरामीटर के लिए एक कस्टम नियमित अभिव्यक्ति निर्दिष्ट करते हैं, उदाहरण के लिए:

match '/images/:id', 
    :via => :get, 
    :constraints => { :id => /[^\/]+/ }, 
    :format => false, 
    :to => 'images#show', 
    :as => :image 

अधिक जानकारी के लिए http://edgeguides.rubyonrails.org/routing.html#specifying-constraints देखें।

0

मुझे ईमेल पता भेजने के साथ समस्याएं आईं।

#this url will cause the following problem 
/resend-validation/[email protected] 
params[:email] = [email protected] 

# I had to encode the email: 
<%= link_to('Resend Code', resend_activation_path(:email => user.email.unpack('H*'))) %> 

# than decode it in controller: 
email = params[:email].split.pack('H*') 
0

से बचने के लिए समस्याओं यूआरएल आप अपने मार्गों परिभाषा जोड़ सकते हैं के माध्यम से '.' (dot) गुजर: करने के लिए

resources :users, :id => /.*/ 

क्रेडिट: https://stackoverflow.com/a/8943634/333061

संबंधित मुद्दे