2010-04-04 5 views
6

Tôi hiểu làm thế nào để tạo ra một URL vanity trong Rails để dịch http://mysite.com/forum/1 vào http://mysite.com/some-forum-nameLàm cách nào để triển khai các url "lồng nhau" trong đường ray?

Nhưng tôi muốn mang nó một bước xa hơn và nhận được sự làm việc tiếp theo (nếu có thể ở tất cả):

Thay vì: http://mysite.com/forum/1/board/99/thread/321

tôi muốn trong bước đầu tiên để có được một cái gì đó như thế này: http://mysite.com/1/99/321

và cuối cùng có nó như http://mysite.com/some-forum-name/some-board-name/this-is-the-thread-subject.

Điều này có khả thi không?

+0

định tuyến nguồn, định tuyến lồng nhau, và định tuyến nông là tất cả sẽ có tên của tài nguyên trong con đường, vì vậy nếu bạn chỉ muốn id hoặc một số diễn đàn-tên trong đường dẫn, bạn sẽ cần phải làm định tuyến thường xuyên, có lẽ với các thông số bị chặn. – Corey

Trả lời

2
+0

đó là những gì tôi đã đọc, nhưng tôi dường như không thể nắm bắt được từ các ví dụ và mô tả có sẵn những gì nên dẫn đến kết quả tôi đang tìm kiếm. Nó có làm tổ cạn không? :Co nhiêu? Hoặc sử dụng map.connect và ký tự đại diện (mà một số người nói rằng bạn không nên sử dụng) ... kinda tìm kiếm gợi ý đi đúng hướng tại đây. – UnSandpiper

1

có thể thử một cái gì đó giống như

map.my_thread ':forum_id/:board_od/:thread_id.:format', :controller => 'threads', :action => 'show' 

Và sau đó trong điều khiển của bạn có

@forum = Forum.find(params[:forum_id]) 
@board = @forum.find(params[:board_id]) 
@thread = @board.find(params[:thread_id]) 

Chú ý rằng bạn có thể có mà MODEL_ID được bất cứ điều gì (tên trong trường hợp này)

Trong của bạn xem, bạn có thể sử dụng

<%= link_to my_thread_path(@forum, @board, @thread) %> 

Tôi hy vọng điều này sẽ giúp

5

Để có công việc này "độc đáo" với những người giúp đỡ URL Rails bạn phải ghi đè to_param trong mô hình của bạn:

def to_param 
    permalink 
end 

đâu permalink được tạo ra bởi lẽ một before_save

before_save :set_permalink 

def set_permalink 
    self.permalink = title.parameterize 
end 

Lý do bạn tạo liên kết cố định là vì, cuối cùng, có thể, có khả năng, bạn sẽ có tiêu đề không thân thiện với URL. Đó là nơi parameterize có sẵn.

Bây giờ, để tìm những bài đăng dựa trên những gì permalink là bạn có thể đi theo tuyến đường dễ dàng hoặc tuyến đường khó.

Dễ đường

Xác định to_param hơi khác nhau:

def to_param 
    id.to_s + permalink 
end 

Tiếp tục sử dụng Forum.find(params[:id]) nơi params[:id] sẽ là một cái gì đó như 1-my-awesome-forum. Tại sao điều này vẫn hoạt động? Vâng, Rails sẽ gọi số to_i trên đối số được chuyển đến find và gọi số to_i trên chuỗi đó sẽ trở về chỉ đơn giản là 1.

đường cứng

Để lại to_param giống nhau.Resort để sử dụng find_by_permalink trong bộ điều khiển của bạn, sử dụng params[:id] định được thông qua theo hình thức các tuyến đường:

Model.find_by_permalink(params[:id]) 

Bây giờ cho các phần thú vị

Bây giờ bạn muốn lấy nguồn ra khỏi URL. Vâng, đó là một cách tiếp cận Sisyphean. Chắc chắn bạn có thể ngừng sử dụng trình trợ giúp định tuyến Ruby on Rails cung cấp chẳng hạn như map.resources và xác định chúng bằng cách sử dụng map.connect nhưng có thực sự đáng giá nhiều không? "Quyền hạn siêu đặc biệt" nào mà nó cấp cho bạn? Không, tôi sợ.

Nhưng vẫn còn nếu bạn muốn làm điều đó, đây là một nơi tuyệt vời để bắt đầu từ:

get ':forum_id/:board_id/:topic_id', :to => "topics#show", :as => "forum_board_topic"