一般に、Ho Manは正しいですが、提案された解決策にはいくつかの注意点があります。
# app/models/page.rb
def to_param
slug
end
# ... which allows you to do this in views/controllers:
page_path(@page)
# instead of
page_path(@page.slug)
第二には、あなたがfind_by!(slug: params[:id])
1に使用すべき最新のもの)(find_by_xxx
がdeprecated in Rails 4.0 and removed from Rails 4.1あった)と2:すべての
まず、あなたはそれが実際にスラグを使用していますので、同様to_param
メソッドをオーバーライドする必要があります)find
の動作を複製し、与えられたスラッグの投稿が見つからない場合にはActiveRecord::RecordNotFound
エラーを発生させます。
第三に、私は常に最新の状態にスラグを維持するために提案し、そうのようなIDが含まれています
# app/models/page.rb
before_validation :set_slug
def to_param
"#{id}-#{slug}"
end
private
def set_slug
self.slug = title.parameterize
end
# ... which allows you to use the regular ActiveRecord find again because it just looks at the ID in this case:
@post = Post.find(params[:id]) # even if params[:id] is something like 1-an-example-post
あなたが検索エンジンの検索結果を気にした場合、あなたがしても<head>
セクションで正規のURLを含める必要があります検索エンジンが一般的に好まない重複コンテンツを避けるために、コントローラーの301状態でリダイレクトすることができます。
# in the view
<%= tag(:link, rel: :canonical, href: page_url(@page)) %>
# and/or in the controller:
redirect_to(post_url(@post), status: 301) and return unless params[:id] == @post.to_param
希望します。