2017-07-18 2 views
-1

Ich entwickle meine Rails App auf der Cloud9.Rails: Wie man den Seitentitel auf URL (Routes) setzt

Was ich tun möchte ist, einen Teil des Titels auf die URL wie stackoverflow setzen.

(z example.com/part-of-tile-here)

Obwohl ich die ähnlichen Fragen gefunden, verstehe ich nicht, was ich tun soll, weil einige von ihnen alte Beiträge sind, Links in der Antwort nicht gefunden werden. (z. B. Adding title to rails route)

Ich werde Gem nicht noch verwenden.

Es wäre zu schätzen, wenn Sie mir einen Hinweis geben könnten.

Antwort

0

Werfen Sie einen Blick auf diese Railscast, die in etwa das ist, was Sie wollen.

tl; dr

Sie wollen eine slug speichern, die eine parametrisierte Titel ist, begrenzt durch -, wenn Sie die Seite speichern. (In einem before_validation oder before_save)

Zum Beispiel, "Random Titel der Seite" wird random-title-of-page generiert wie es Slug ist.

before_validation :generate_slug 
def generate_slug 
    self.slug ||= title.parameterize 
end 

auf der Seite Controller, müssen Sie von slug Suche ermöglichen.

2

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.

Verwandte Themen