2011-02-11 23 views
7

Kullanıcı modelimdeki e-posta adresini kimlik olarak kullanmak için to_param'ı geçersiz kılmaya çalıştığımda rotalarımda bir hata alıyorum. Rotayı eşlemeye çalışırken kimliği için tüm nesneyi eşleştirmeye çalışıyor gibi görünüyor. Neyi kaçırdığımı anlamaya yardımcı olan var mı?Raylar 3.0: modeldeki to_param'ı geçersiz kıldığınızda yollar ile ilgili hata

İşte hata var:

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

Burada kodunuzu kurduktan nasıl.

modeller/user.rb:

attr_accessible :email  

def to_param 
    email 
end 

kontrolörleri/users_controller.rb:

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

... 

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

yapılandırma burada/routes.rb

resources :users 

Ve tırmık yolları çıktısı var:

 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

Eğer bu hataya lütfen açar, bağlantı göstermektedir.Tüm kodunuz doğru, bu yüzden hata bağlantınız – fl00r

+0

'dur. Sorun şu an gösterilmekte, düzenlenmekte, güncellenmekte ve yolları imha edilmektedir. Bu yüzden ya tarayıcıda (/users/[email protected] adresindeki yola gitmeye veya görünümde link_to çağırarak <% = link_to "Göster", kullanıcı%> veya <% = link_to "Düzenle" gibi) gezinmeye çalışın. , edit_user_path (user)%> – Bee

cevap

5

Sorun, e-postanın "." Yazmasıdır. (nokta) url içinde ve bu raylar karıştırır, çünkü bir "com" biçimini bulmaya çalışır (e-posta, .com içinde biterse)

Bu kodu uygulamalarimdan birine ekledim (Kullanıcılarım var Kullanıcıların yerine) ve düzgün çalışıyor, bu yüzden hile noktayı başka bir şeyle değiştirmektir. '-' ile değiştirmeyi tercih ettim - veya + gibi diğer semboller e-posta adreslerinde geçerlidir.

dosya 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 

dosya people_controller.rb

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

bu http://jroller.com/obie/entry/seo_optimization_of_urls_in nasıl çalıştığı hakkında biraz daha ipucu vardır.

Soru için teşekkürler, sadece raylar ile başlıyorum, bu gerçekten nasıl çalıştığını anlamak için bana yardımcı oluyor :).

+0

Teşekkürler, Augusto! blog yazısı, to_param durumunu biraz daha iyi anlamamı sağladı. Yine de, burada daha fazla bir şey olduğunu düşünüyorum .. kontrol cihazımda find_by_email kullanıyorum. User.find yerine param, sadece rotada e-postayı kullanarak bir sorun var gibi görünüyor.Genel olarak test etmek için kullanıcı modeline bir 'name' alanı ekledim ve to_param ile geçersiz kılmak için iyi çalışıyor : name özniteliği, ancak e-posta hala başarısız, öneri olarak id idrarını dahil olmak üzere.Özellikle e-posta başarısız herhangi bir fikir neden? – Bee

+0

Ben sorunu buldum. Lütfen cevabı yeniden kontrol edin – Augusto

+0

Ah evet, hata çıkışında gördüğünüzde '.com' parçasını bu format argümanına ayrıştıran paramları gösterir. Bunu anlatan yardım için nks! – Bee

2

Noktalar ekleyebilirsiniz. senin to_param dönüş değeri örneğin, rotanız 'kimlik' parametresi için özel bir ifade belirtin eğer:

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

fazla ayrıntı için http://edgeguides.rubyonrails.org/routing.html#specifying-constraints bakınız.

0

GET e-posta adresi göndermekle ilgili sorunlarla karşılaştım. Eğer yolları tanımı ekleyebilir URL üzerinden '.' (dot) geçen

#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*') 
İlgili konular