3

RailsのURLを次のようにしたいと思います。

/posts/345/the-great-concept

投稿モデルで以下を使用すると、

def to_param
   "#{id}/#{name.parameterize.downcase}"
end

URLは、ブラウザのmousoverで見栄えがします。正しく機能します。ただし、ページがブラウザのURLに読み込まれると、次のようになります。

/posts/345%2Fthe-great-concept

明確にするために、「名前」は見栄えを良くするためのものです。投稿はidによってのみ取得されます。また、データベーススラッグアプローチを使用したくありません。

これにどのようにアプローチすればよいですか?

ps。「/posts/345-the-great-concept」も必要ありません...

4

1 に答える 1

4

パスの一部ではなくパラメーターであるためエスケープされているため、エスケープする必要があります。そうしないと、間違った uri になります。

def to_param
  "#{id}-#{name.parameterize.downcase}"
end

編集:わかりました、スラッシュは確かに重要です。これに対処する方法は次のとおりです。

そのためのカスタム ルートを作成します。

# in config/routes.rb
resources :posts
match '/posts/:id/:slug' => 'posts#show', :as => :slug

次に、slug メソッドを作成します。

# in app/models/post.rb
def slug
  title.parameterize.downcase
end

次に、ルートを show アクションに変更して、派手な URL へのリンクを作成します。

# in any link to show; redirect after create, etc..
link_to slug_path(@post, :slug => @post.slug)

これらすべてをテストするアプリを作成しました。興味がある場合は、 https ://github.com/unixmonkey/Pretty-Path で確認できます。

于 2011-04-02T23:13:47.500 に答える