Tất cả các giải pháp này sử dụng find_by_name
, chắc chắn sẽ yêu cầu có chỉ mục trên cột đó và yêu cầu chúng là duy nhất. Một giải pháp tốt hơn mà chúng tôi đã sử dụng, hy sinh một số lượng nhỏ của vẻ đẹp, là sử dụng tiền tố tên nhà cung cấp với ID của nó. Điều này có nghĩa là bạn không cần phải có chỉ mục trên cột tên của bạn và/hoặc yêu cầu tính duy nhất.
vendor.rb
def to_param
normalized_name = name.gsub(' ', '-').gsub(/[^a-zA-Z0-9\_\-\.]/, '')
"#{self.id}-#{normalized_name}"
end
Vì vậy, đây sẽ cung cấp cho bạn các URL như
/1-Acme
/19-Safeway
vv
Sau đó, trong chương trình của bạn hành động bạn vẫn có thể sử dụng
Vendor.find(params[:id])
vì phương pháp đó sẽ ngầm gọi .to_i
trên đối số của nó và gọi to_i
trên chuỗi như vậy sẽ luôn trả về tiền tố số và thả văn bản còn lại - tất cả fluff tại điểm đó.
Trên đây giả sử bạn đang sử dụng các tuyến đường mặc định của /:controller/:action/:id
, mà sẽ làm cho URL của bạn trông giống như
/nhà cung cấp/show/1-Acme
Nhưng nếu bạn muốn họ chỉ cần nhìn
/1-Acme
Sau đó, có một con đường như
map.show_vendor '/:id', :controller => 'vendors', :action => 'show'
Điều này có nghĩa là nó sẽ nuốt khá nhiều URL mà bạn có thể không muốn nó. Hãy cảnh báo.
Nguồn
2009-04-07 05:10:17
Hi, cảm ơn cho điều này - ý của bạn là "nuốt nhiều URL mà bạn không muốn nó?" oh, bạn có nghĩa là các tuyến đường sẽ thay đổi khá nhiều bất cứ điều gì gọi điều khiển mà bạn có nghĩa là? Tôi ổn với các nhà cung cấp/show/1-Acme ... nó ảnh hưởng như thế nào đến SEO? – AFG
Có, '/: id' sẽ khớp với rất nhiều thứ, vì vậy bạn sẽ phải có rất nhiều tuyến đường được đặt tên cho '/ about', '/ contact', v.v. Đối với SEO, tôi nghĩ rằng tiền tố số là không đáng kể . –
Vậy làm cách nào để tạo một tuyến đường được đặt tên cho các nhà cung cấp/danh sách tương ứng với hành động trong vendor_controller.rb được gọi là 'list'? Cảm ơn. Nếu không nó có vẻ tốt. – AFG