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/:id
、posts/: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 3.1 :as => :admin 更新受 attr_accessible 保护的属性
rails 3 - 在javascript响应中转义部分生成的html
3.1.3MySQL__数据库基本建表查询,登录,sql语句,建表语句,修改表结构,增删改查,as别名,limit分页,distinct去重,聚合函数,