17

Railsで次のようなURLを実現しようとしています:

http://localhost/posts/1234/post-slug-name

どちらかの代わりに ID とスラッグ名の両方を使用

http://localhost/posts/1234

また

http://localhost/posts/post-slug-name

(今はURLにスラッグ名しかないので、この部分は終わりです)。これどうやってするの?

UPD

これに関する記事を見つけました: http://augustl.com/blog/2009/styling_rails_urls/、代わりに、私にとって完全に機能するもの/id/slugを使用することを提案しているので、これを使用します。/id-slug

4

6 に答える 6

30

Rails には、SEO フレンドリーな URL のサポートが組み込まれています。

モデルでto_paramメソッドをオーバーライドするだけで、「id-title」の形式で URL を作成できます。

これは私のプロジェクトの 1 つからのもので、ID、カテゴリ名、モデル名を使用して URL を作成します。

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

Rails は、コントローラー アクションにアクセスするときにこれを抽出して単純な ID に戻すのに十分なほどスマートなので、次のように動作します。

def show
  @model = Model.find(params[:id])
  render :action => "show"
end
于 2010-04-13T23:31:19.150 に答える
9

リソース ルートに加えて、Route Globbingを使用して通常のルートを追加する必要があります (もちろん、postsルートがそのように定義されていると仮定します)。例えば、

map.resources :posts
map.connect '/posts/:id/*slugs', :controller => 'posts', :action => 'show'
于 2010-04-13T20:13:44.323 に答える
7

friendly_idを使用します。それは1つの素晴らしい機能を持っています:あなたは古いものを壊すことなくあなたのURLを更新することができます。

ビューURLの生成が機能していません。モデルに小さなメソッドを追加しました

def to_param
  self.friendly_id
end
于 2011-03-09T05:50:28.717 に答える
4

質問がかなり古いことは知っていますが、まだ関心に値すると思います。最新の回答や、OPが探していたものを正確に生成する方法を提供する回答はありません(つまりhttp://localhost/posts/1234/post-slug-name)。

routes.rb 内

get 'posts/:id/:slug', to: 'posts#show', as: 'slugged_post'

次に、ビューで

<%= link_to slugged_post_path(post, post.name.parameterize) %>

ビューでパラメータ化を呼び出さないように、モデルでスラッグ メソッドを定義することをお勧めします。

于 2016-02-27T11:55:16.273 に答える
0

stringex gem には、属性の URI フレンドリーな表現を作成するための ActsAsUrl が含まれています。

https://github.com/rsl/stringex

また、Unicode を ASCII に変換できる Unidecoder ライブラリも含まれています。

于 2012-04-30T14:26:21.797 に答える
0

Rails 3 のスラッグについての記事を書きました。スラッグはかなりの URL を提供するだけでなく、ID を増やすだけで情報を要求するランダムなスクリプトからサイトを保護します。また、データベースにスラッグを保存することも避けます。

于 2012-05-16T04:26:06.533 に答える