我正在使用 Rails 3,在设置了 slugs 后,我发现 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
的所有相关路径也运行良好。
有人知道会发生什么吗?
我已将存储库上传到 https://github.com/cultofmetatron/cassowary/tree/photogallary
我知道我的代码很糟糕,我仍在学习系统的来龙去脉,我希望能深入了解正在发生的事情。
在您的评论中,第一部分似乎很好:在 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
的方式。 通过覆盖帖子模型中的to_param
来执行此操作,例如
def to_param
"/posts/#{slug}"
end
然后你就完成了。 或。
之后,看看friendly_id宝石如何做同样的事情:-(https://github.com/norman/friendly_id