你要查找friendly_id
,有一個good RailsCast about it here:
從本質上講,你需要的是能在你的系統來處理slugs。
IE不是通過id
(primary_key
),而是使用另一個標識符(在我們的例子中爲「slug」)標識記錄。
Friendly ID
利於這一點 - 這裏是如何:
#app/models/book.rb
class Book < ActiveRecord::Base
extend FriendlyID
friendly_id :title, use: :slugged
end
這使您可以使用您的控制器實現以下功能:
#app/controllers/books_controller.rb
class BooksController < ApplicationController
def show
@book = Book.find params[:id] #-> the route passes the "slug" as "id" still
end
end
#config/routes.rb
resources :books #-> url.com/books/:id -> you can pass the "slug" to ID
-
你have to add a column您您希望使用的表格friendly_id
(您的情況爲books
和reviews
):
$ rails g migration AddSlugToBooks
#db/migrate/add_slug_to_books______.rb
class AddSlugToBooks
def change
add_column :books, :slug, :string
add_column :reviews, :slug, :string
end
end
然後運行rake db:migrate
之後(重要的),你需要更新你的當前記錄。要做到這一點,你應該使用下列內容:
$ rails c
$ Book.find_each(&:save)
$ Review.find_each(&:save)
這將讓路由與蛞蝓的工作,讓你打電話的喜歡:
book_path("harry_potter")
嵌套資源
作爲補充說明,您需要查找名爲nested resources的路由原則。使用這些
,你就可以使用下列內容:
#config/routes.rb
resources :books do
resources :reviews, only: [:index, :show] #-> url.com/books/:book_id/reviews
end
這會給你使用以下的能力:
#app/controllers/reviews_controller.rb
class ReviewsController < ApplicationController
def index
@book = Book.find params[:id]
@reviews = @book.reviews
end
end
因此你會與結束如下:url.com/books/harry_potter/reviews
如果你想寫你自己的方法:http://code-worrier.com/blog/custom-slugs-in-rails/ –
如果你只想使用一個gem:https:// github的.com /諾曼/ F riendly_id –
@LannyBose謝謝你的鏈接!正是我需要的! – fox