2017-07-18 30 views
-1

Cloud9でRailsアプリケーションを開発します。Rails:ページタイトルをURL(ルート)に設定する方法

私がしたいのは、stackoverflowなどのURLのタイトルの一部を設定することです。

(例えばexample.com/part-of-tile-here

私は同様の質問を見つけたが、私はそれらのいくつかは古い記事ですので、私は何をすべきか理解していないが、答えのリンクが見つかりません。 (例:Adding title to rails route

私はまだGemを使用しません。

私に何かヒントを与えていただければ幸いです。

答えて

0

おおよそあなたが望むこのRailscastをご覧ください。

TL; DR

あなたはページを保存するとき-で区切られたパラメータ化タイトル、あるslugを保存したいと思います。 (before_validationまたはbefore_save

たとえば、「ランダムタイトル」では、スラッグとしてrandom-title-of-pageが生成されます。ページコントローラで

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

、あなたはslugで検索可能にする必要があります。

def show 
    @page = Page.find_by_slug(params[:id]) 
end 
2

一般に、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_xxxdeprecated 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 

希望します。

関連する問題