2009-04-07 36 views
11

ứng dụng của tôi là trong RoRlàm cách nào để tạo URL trong Ruby on Rails SEO thân thiện khi biết @ vendor.name?

Tôi có một hành động/xem gọi showsummary nơi ID đã được thông qua vào URL, và bộ điều khiển đã sử dụng mà để nhanh chóng @vendor nơi @ vendor.name là tên của một công ty .

Thay vào đó, tôi muốn URL thay vì hiển thị tóm tắt/1/có tên/nhà cung cấp trong URL.

Tôi làm như thế nào?

Trả lời

7

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.

+0

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

+0

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ể . –

+0

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

0

Tôi phải thử nghiệm một chút để làm đúng, nhưng có hai phần chính của giải pháp.

1) Thêm tuyến đường. trong cấu hình/tuyến đường, thêm một dòng gửi yêu cầu của biểu mẫu baseurl/controller /: vendor-name đến action showsummary, (hoặc có thể là hành động mới, show_summary_by_vendor_name) [cũng vậy, nếu bạn định sử dụng baseurl /: vendorname , cũng tốt thôi] Để thuận tiện, hãy đảm bảo thông số giống như: tên nhà cung cấp, không phải là mặc định: id

2) Viết hành động của bộ điều khiển. Trong tệp bộ điều khiển, hãy chỉnh sửa hành động showummary của bạn để phân biệt dựa trên việc nó được gọi với id hay với một vendorname hay chỉ viết một show_summary_by_vendor_name. (tùy thuộc vào thực hành tốt nhất và tuyến đường bạn đã viết trong 1. Tôi không biết đầu của tôi thích hợp hơn) Bạn có thể làm @vendor = Vendors.find_by_name (params [: vendor_name]) hoặc một cái gì đó như thế, và sau đó làm cho nó theo cách bạn sẽ trong showsummary thường xuyên.

3) Sử dụng làm liên kết. Khi bạn xác nhận rằng baseurl [/ controller?]/Vendor-name hoạt động và hiển thị tóm tắt, hãy đảm bảo tất cả các liên kết trong ứng dụng của bạn và ở nơi khác, hãy sử dụng liên kết đó. Trên đỉnh đầu của tôi, tôi không thể nhớ được việc tích hợp một tuyến đường tùy chỉnh vào link_to như thế nào, nhưng tôi nghĩ nó có thể thực hiện được. Hầu hết các công cụ tìm kiếm [google] dựa rất nhiều vào các liên kết, vì vậy SEO tốt sẽ giúp bạn sử dụng các liên kết được đặt tên đó chứ không phải các liên kết được đánh số. Tôi nghĩ. Tôi không biết nhiều về SEO.

3

Ryan Bates có số lượng lớn screencast về chủ đề này.

Về cơ bản bạn quá tải phương thức to_param trong mô hình Nhà cung cấp.

def to_param 
    permalink 
    end 

Sau đó, khi bạn tìm kiếm các nguồn tài nguyên trong bộ điều khiển của bạn, bạn làm điều gì đó như thế này:

@vender = Vender.find_by_name(params[:id]) 

Nhưng vấn đề với điều này là bạn sẽ phải chắc chắn rằng tên của nhà cung cấp là độc nhất. Nếu họ không thể được sau đó làm các giải pháp khác mà Ryan đề nghị nơi ông prepends id để tên và sau đó phân tích các kết quả uri để tìm id mục.

1

Bạn làm điều này bằng cách sửa đổi các tuyến đường được sử dụng để truy cập các URL đó và thay đổi chúng để sử dụng: tên, thay vì: id. Điều này có thể có nghĩa là bạn phải tự viết các tuyến đường thay vì dựa vào tài nguyên.

Ví dụ: thêm mục này vào các tuyến đường.tập tin rb:

map.with_options :controller => "vendor" do |vendor| 
    vendor.connect "/vendor/:name", :action => "show" 
    # more routes here for update, delete, new, etc as required 
end 

Sự thay đổi khác sẽ được yêu cầu là bây giờ bạn sẽ phải tìm ra đối tượng nhà cung cấp trong cơ sở dữ liệu bằng tên không phải là id, vì vậy:

@vendor = Vendor.find_by_name(params[:name]) 

nội (ít nhất là kiến ​​thức/thử nghiệm của tôi) bất kỳ tên tham số nào không được chỉ định trong phần URL của tuyến đường (tức là không nằm trong phần "/ Controller/Action /: id") được gắn vào cuối như một tham số.

6

Tôi nghĩ tôi muốn đề cập đến Chuỗi # parameterize, như là một bổ sung cho câu trả lời được gắn thẻ.

def to_param 
    "#{id}-#{name.parameterize}" 
end 

Nó sẽ lọc ra các ký tự gạch nối, thay dấu cách bằng dấu gạch ngang, vv

+0

thật thú vị ... bất kỳ nhược điểm nào? – AFG

+0

Mọi thứ đều có nhược điểm! Có thể là liên kết sẽ tự động thay đổi nếu thuộc tính 'tên' thay đổi, có thể được kiểm soát chính xác hơn nếu bạn lưu trữ liên kết cố định trong một thuộc tính riêng biệt trong cơ sở dữ liệu. –

Các vấn đề liên quan