Im Allgemeinen hat Ho Man Recht, aber es gibt einige Vorbehalte zu der vorgeschlagenen Lösung.
Zunächst einmal sollten Sie die to_param
Methode als auch außer Kraft setzen, so dass es tatsächlich die Schnecke verwendet:
# 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)
Zweitens sollten Sie find_by!(slug: params[:id])
-1 verwenden) auf dem neuesten Stand (find_by_xxx
war deprecated in Rails 4.0 and removed from Rails 4.1) und 2) um das Verhalten von find
zu replizieren und einen ActiveRecord::RecordNotFound
Fehler auszulösen, falls für den gegebenen Slug kein Post gefunden werden kann.
Drittens schlage ich vor, die Schnecke immer aktuell zu halten und beinhalten die ID wie folgt:
# 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
Wenn Sie über Suchmaschinen-Ergebnisse interessieren, sollten Sie dann auch die kanonische URL im <head>
Abschnitt und/oder mit einem 301 Status in der Steuerung umleiten doppelten Inhalt zu vermeiden, die Motoren im allgemeinen sucht nicht mögen:
# 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
Hoffnung, das hilft.