rails_3_question :as => 为啥在设置 slug 后我的 /posts/new 路由到 posts/show

Posted

技术标签:

【中文标题】rails_3_question :as => 为啥在设置 slug 后我的 /posts/new 路由到 posts/show【英文标题】:rails_3_question :as => why is my /posts/new routing to posts/show after setting up a slugrails_3_question :as => 为什么在设置 slug 后我的 /posts/new 路由到 posts/show 【发布时间】:2012-04-07 11:59:03 【问题描述】:

我正在使用 Rails 3,在设置 slug 后,我发现 posts/new 不再有效。

posts/:idposts/:id/edit 和所有其他 CRUD 操作都有效。

但是/posts/new 给了我一个路由错误

没有路线匹配 :action=>"show", :controller=>"posts"

现在由于某种原因posts/new 正在路由到posts#show。在我的路线中,它只是

resources :posts

我的理论是,由于 /posts/:slug 现在匹配数字 id 以外的东西,所以 show 动词被路由到第一个。但是它没有任何意义,因为posts/grr 一个不存在的条目会给出与posts/new 不同的错误,而posts/first 的所有相关路径也都可以正常工作。

有人知道会发生什么吗?

我已将 repo 上传到https://github.com/cultofmetatron/cassowary/tree/photogallary

我知道我的代码很烂,我仍在学习系统的来龙去脉,如果能深入了解正在发生的事情,我将不胜感激。

【问题讨论】:

我认为你的理论是正确的——很可能它会退回到帖子#show,因为那将(否则)是索引页面(也就是说,只有 /posts 会处理帖子#show)。也就是说,它会查找 slug 为“新”的记录,但没有找到。你是如何设置 slugs 的(gem,还是你自己的?)—— gem 可能有一些路由魔法,这在 routes.rb 中可能不明显。运行 rake routes 以查看 Rails 认为的有效路径模式。 (哦,PS,这个问题的标题真棒:-) 哈哈是的,我希望有人会注意到。 :P (谢谢,我希望有人会注意到。无论如何,我从头开始滚动它以了解它是如何完成的。我添加了一个 url_slug 字符串添加到 post 模型中,并将 @post.url_slug 添加到每个rout 辅助方法。它适用于编辑、索引和显示,但不适用于 new。这很奇怪。 我添加了一个可能相对接近正确的答案。请尝试一下,看看我在哪里搞砸了,然后我会进行编辑以使其正确,这样下次我需要这样做时,我会记住......谁知道呢,也许其他人会觉得它有用. 【参考方案1】:

在您的评论中,第一部分似乎很好:在 Post 列中添加一个名为 slug 的列,依此类推,其内容将成为用于显示特定帖子的部分或全部 URL。 (我假设其他 CRUD 操作应该正常工作)

要找到 URL,路由器必须知道如何知道哪个控制器和操作将处理这个 URL(与其他控制器相比)。普通的 resources :posts 路由将匹配所有 RESTful 方法,例如将 GET 请求映射到以控制器名称开头的路径上,如果指定了 id (/posts/1),则映射到 posts#show 控制器方法,如果没有,则映射到 posts#index 方法。如果请求是 PUT、DELETE 或 POST,则会发生围绕标准化 URL 格式的不同操作。

需要进行两项更改:

    post slug 格式的 URL 需要映射到 posts#show 方法(相应修改),并且 在您的网站上生成的任何指向 show 页面的链接都需要使用 post slug 而不是 id

我假设您可以接受以 /posts 开头的 URL(如果不是,您需要确定其他一些独特的模式)。

第一个更改要求您使用路由通配符覆盖 show 方法的特定情况,我在标准资源路由之前添加类似 match 'posts/*slug 的内容。以下是路线通配指南的链接:http://guides.rubyonrails.org/routing.html#route-globbing

下一个更改,修改现有的posts#show 方法,使其查找slug 而不是id,例如

def show
  @post = Post.where("slug = ?", params[:slug])
  ...
end

最后,改变 Rails 处理 URL 帮助器 posts_path 的方式。通过在 Post 模型中覆盖 to_param 来做到这一点,例如

def to_param
  "/posts/#slug"
end

然后你就完成了。也许吧。

之后,看看friendly_id gem 是如何做同样的事情的 :-) https://github.com/norman/friendly_id

【讨论】:

以上是关于rails_3_question :as => 为啥在设置 slug 后我的 /posts/new 路由到 posts/show的主要内容,如果未能解决你的问题,请参考以下文章

Rails 急切加载

使用 Rails 3.1 :as => :admin 更新受 attr_accessible 保护的属性

rails 3 - 在javascript响应中转义部分生成的html

Rails 路由约束和 UTF-8

AS3 > 按顺序显示数组图像的按钮?

3.1.3MySQL__数据库基本建表查询,登录,sql语句,建表语句,修改表结构,增删改查,as别名,limit分页,distinct去重,聚合函数,