Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 3-定制资源丰富的路由_Ruby On Rails_Ruby_Routes - Fatal编程技术网

Ruby on rails Rails 3-定制资源丰富的路由

Ruby on rails Rails 3-定制资源丰富的路由,ruby-on-rails,ruby,routes,Ruby On Rails,Ruby,Routes,我已经为一个博客设置了资源丰富的路线(型号名称:Article) 我想定制我的足智多谋的路线指向 articles/show/title-of-my-article 现在我读了一遍: 但它似乎并没有解释如何覆盖参数,而不仅仅是:controller或:action。问题是我可以执行单个资源或匹配GET请求,但我希望覆盖我的资源路由,这样我仍然可以使用所有资源帮助程序(即article_path(@article.title))等 有人能帮我吗?非常感谢所有人的帮助 您应该覆盖模型上的to_p

我已经为一个博客设置了资源丰富的路线(型号名称:Article)

我想定制我的足智多谋的路线指向

articles/show/title-of-my-article
现在我读了一遍:

但它似乎并没有解释如何覆盖参数,而不仅仅是:controller或:action。问题是我可以执行单个资源或匹配GET请求,但我希望覆盖我的资源路由,这样我仍然可以使用所有资源帮助程序(即article_path(@article.title))等


有人能帮我吗?非常感谢所有人的帮助

您应该覆盖模型上的to_param方法:

class Article
  def to_param
    self.title
  end
end

如果你想变得更棘手一点,除了乔尼的答案,你还应该仔细阅读。

当您调用资源帮助程序(如
article\u path(@article)
)时,将
覆盖到\u param
方法将生成标题,并将其作为
params[:id]
传递给控制器

此后,您将需要或多或少手动查找文章,即,而不是执行

Article.find(params[:id])
你需要这样做

Article.find_by_title(params[:id])
我不记得如果未找到记录,是否会创建一个
NotFound
异常,因为
find
方法是这样做的。在这种情况下,您必须手动检查是否找到记录,如果未找到,则自己引发异常,以触发404页面

这样做的一个问题是,标题可能由URL中不允许或不推荐的字符组成,因此更好的方法是基于标题在数据库中存储一个slug,并通过该方法找到它

(您可以通过模型中的过滤器自动创建slug,并通过
title.parameterize
创建slug)


当然,最简单的方法是使用已经处理这些事情的众多gem和插件中的一个。

是的,我知道我必须去掉标题中所有不好的部分,使其对URL友好。我将编写自己的或使用gem在before_save过滤器中操纵标题,并将操纵的字符串保存在DB的URL字段中。然后只需覆盖jonnii提供的to_param方法。非常感谢你们两位!