在url中,如何在rails上的ruby中显示title-name而不是id?

Pri*_*Dey 4 ruby ruby-on-rails ruby-on-rails-4 ruby-on-rails-4.1 ruby-on-rails-4.2

我使用的是rails 4和ruby 2.我在rails应用程序中创建了一个博客部分.我需要更改显示页面中的网址.我的问题是,我希望我的网址中的标题而不是ID.我想http://www.domain.com/articles/blog_title而不是http://www.domain.com/articles/9.我怎样才能做到这一点?如果有人对此有任何想法,请与我分享.

我的代码:

ArticlesController:

def index
    @articles = Article.all
    @articles = Article.paginate(:page => params[:page], :per_page => 5).order('created_at DESC')
end

def show
  @article = Article.find(params[:id])
end

private

def article_params
  params.require(:article).permit(:title, :body)
end
Run Code Online (Sandbox Code Playgroud)

routes.rv

resources :articles
Run Code Online (Sandbox Code Playgroud)

Raj*_*ngh 6

有这个目的的真棒宝石命名friendly_id,https://github.com/norman/friendly_id

在你的文章模型中,你只需要添加它,

extend FriendlyId
friendly_id :name, use: :slugged
Run Code Online (Sandbox Code Playgroud)

还有许多其他选项,您需要查看文档.

希望有所帮助!


Nit*_*nke 6

实际上你可以覆盖to_param方法.你不需要有任何宝石.

如果你有slug列,那就放

def to_param
    self.slug.parameterize
end
Run Code Online (Sandbox Code Playgroud)

如果你想去标题那么

def to_param
    self.title.parameterize
end
Run Code Online (Sandbox Code Playgroud)

请记住将slug或标题列(无论您使用哪个)编入索引,以便更快地进行搜索.

  • 好答案.你还应该提到`@article = Article.find(params [:id])`应该改为`@article = Article.find_by(slug:params [:id])` (2认同)