2011-02-11 26 views
7

Tôi gặp lỗi với tuyến đường khi cố gắng ghi đè to_param trong mô hình người dùng của mình để sử dụng địa chỉ email làm id. Dường như cố gắng khớp toàn bộ đối tượng cho id khi nó cố khớp với tuyến đường. Bất cứ ai có thể giúp tôi tìm ra những gì tôi đang mất tích?Rails 3.0: lỗi với các tuyến đường khi ghi đè to_param trong mô hình

Dưới đây là các lỗi:

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

Đây là cách tôi đã thiết lập mã.

mô hình/user.rb:

attr_accessible :email  

def to_param 
    email 
end 

controllers/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 

Và đây là kết quả từ các tuyến đường cào:

 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

cho bạn thấy liên kết, dẫn đến lỗi này, xin vui lòng.Tất cả mã của bạn là đúng, do đó, lỗi nằm trong liên kết của bạn – fl00r

+0

Sự cố đang hiển thị, chỉnh sửa, cập nhật và hủy đường dẫn. Vì vậy, hoặc cố gắng điều hướng đến đường dẫn trong trình duyệt (/users/[email protected] hoặc gọi liên kết_to trong chế độ xem, chẳng hạn như <% = link_to "Hiển thị", người dùng%> hoặc <% = link_to "Chỉnh sửa" , edit_user_path (user)%> – Bee

Trả lời

5

Sự cố là email thêm '.' (dấu chấm) trong url và điều đó làm xáo trộn đường ray, vì nó cố gắng tìm định dạng "com" (nếu email kết thúc bằng .com)

Tôi đã thêm mã này vào một trong các ứng dụng của tôi (Tôi có người thay vì Người dùng) và nó hoạt động đúng cách, do đó, mẹo là thay thế dấu chấm bằng một thứ khác. Tôi đã chọn thay thế bằng '@' như các ký hiệu khác như - hoặc + là hợp lệ trong địa chỉ email.

tập tin 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 

tập tin people_controller.rb

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

Có một số gợi ý thêm về cách thức làm việc trong http://jroller.com/obie/entry/seo_optimization_of_urls_in.

Cảm ơn câu hỏi, tôi chỉ mới bắt đầu với đường ray, vì vậy điều này thực sự giúp tôi hiểu cách hoạt động :).

+0

Cảm ơn, Augusto! bài đăng trên blog đã giúp tôi hiểu tình huống to_param tốt hơn một chút.Tuy nhiên, tôi nghĩ có điều gì đó đang diễn ra ở đây .. trong trình điều khiển của mình Tôi đang sử dụng find_by_email để tìm người dùng từ các param, thay vì User.find Nó dường như có một vấn đề chỉ với việc sử dụng các email trong các tuyến đường.Tôi đã thêm một lĩnh vực 'tên' để mô hình người dùng chỉ để kiểm tra nó, và nó hoạt động tốt để ghi đè to_param với : tên thuộc tính, nhưng email vẫn không thành công, bao gồm cả nếu tôi thêm vào id theo gợi ý của bạn.Bất cứ ý tưởng nào tại sao email cụ thể không thành công? – Bee

+0

Tôi đã tìm ra được vấn đề Vui lòng kiểm tra lại câu trả lời – Augusto

+0

À vâng, tôi thấy trong đầu ra lỗi nó cho thấy các params nó đang phân tích phần '.com' thành đối số định dạng này. nks cho sự giúp đỡ figuring này ra! – Bee

2

Bạn có thể bao gồm dấu chấm '.' trong giá trị trả về to_param của bạn nếu bạn chỉ định một biểu thức tùy chỉnh thường xuyên cho các tham số 'id' trong tuyến đường của bạn, ví dụ:

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

Xem http://edgeguides.rubyonrails.org/routing.html#specifying-constraints để biết thêm chi tiết.

0

Tôi gặp phải sự cố khi gửi địa chỉ email máng GET.

#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*') 
Các vấn đề liên quan