簡単な質問です。
@post.slug が (ex) "this-is-the-post-name" を返すように、投稿コントローラーにスラッグ メソッドを作成しました。
ただし、routes.rb ファイルを機能させるために何をすればよいか ('posts/this-is-the-post-name') がわからず、答えにぴったり合う質問やガイドが見つかりませんでした。どうすればいいですか?
簡単な質問です。
@post.slug が (ex) "this-is-the-post-name" を返すように、投稿コントローラーにスラッグ メソッドを作成しました。
ただし、routes.rb ファイルを機能させるために何をすればよいか ('posts/this-is-the-post-name') がわからず、答えにぴったり合う質問やガイドが見つかりませんでした。どうすればいいですか?
すでにリソースを設定している場合は、ルートに何も追加する必要はありません。そうでない場合、ルートに必要なのは
resources :posts
次に、スラッグをパラメーターとして使用するにはto_param
、投稿モデルでメソッドを定義する必要があります。
# post.rb
def to_param
slug
end
このメソッドは、オブジェクトを URL に変換するために url_for によって呼び出されます。例えば
>> @post.slug = 'this-is-the-post-name'
>> post_path(@post) = '/posts/this-is-the-post-name'
もう 1 つ注意しなければならないことは、レコードのフェッチです。URL には投稿の ID が含まれなくなったため、スラッグで検索する必要があります。たとえば、show アクションで
def show
# this will not work anymore
# @post = Post.find params[:id]
# you should change this to
@post = Post.find_by_slug params[:id]
end
jvnillの答えを拡張して、スラッグがpostsテーブルの列であり、一意であることを確認してください。そうしないと、問題が発生します。
独自のロールを作成することは常に良い学習体験ですが、スラッグを処理する gem を使用する方がより実用的かもしれません。FriendlyId
積極的に開発されており、多くの優れたオプションがあり、スラッギングが非常に簡単になるため、私は一般的に頼ります。