Để 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"
đị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