1

在查看帖子时,我在我的 rails 应用程序中使用 slug 而不是 ID 来美化 url。

因此,在我的articles.rb 文件中,我目前将其用于所有链接:

 def to_param
    slug
  end

这会产生一个类似的网址:...articles/this-is-a-test-article

我现在只想在编辑帖子时使用普通的 id url 格式,有没有办法修改它以允许我这样做?

即……文章/7

作为参考,在我的文章控制器中,我有:

def edit
@article = Article.find_by_slug(params[:id])
end

任何帮助将不胜感激,谢谢。

4

3 回答 3

2

友好ID

你会更好地使用friendly_id

这完全符合您的需要(您已经拥有该slug列,并且您需要这样做):

#app/models/article.rb
Class Article < ActiveRecord::Base
    friendly_id :slug, use: [:slugged, :finders]
end

--

.find

之所以friendly_id会很好,是因为它采用了findRails 的方法来处理 slug 和 id:

#app/controllers/articles_controller.rb
def [action]
    @article = Article.find params[:id]
end

这意味着您可以这样做:

article_path(@article) #-> can have either id or slug attributes present

这将使用或填充:id参数,具体取决于存在的情况,允许您在控制器中为任何一个调用方法。idslugfind

于 2014-05-31T10:37:01.117 回答
0

所以,在你总是得到的参数中params[:id],有时这等于你想要的文章的 slug,而在其他时候它等于 id。

在前一种情况下,你应该说

@article = Article.find_by_slug(params[:id])

在后一种情况下,您应该说

@article = Article.find_by_id(params[:id])

您可以使用 before_filter 来管理它,您不会在编辑操作中使用它或类似的东西。

编辑:

要创建使用 id 而不是 params 的链接,只需在帮助程序中具体说明:如果您通过对象,rails 将在其上调用 to_param 以生成 params[:id] 的值。您不必通过对象:

edit_article_path(:id => @article.id)
于 2014-05-30T13:45:42.487 回答
0

您可以将它添加before_action为您想要的方法slug以及editbefore_action

像这样的东西

before_action :set_article, only: [:show,:update, :destroy]

def edit

@article = Article.find_by_id(params[:id])

end

private
def set_article
@article = Article.find_by_slug(params[:id])
end
于 2014-05-30T13:49:17.470 回答