rails_3_question :as => 为什么我的 /posts/new 路由到帖子/显示后设置了一个 slug



我正在使用 Rails 3,在设置了 slugs 后,我发现 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的所有相关路径也运行良好。

有人知道会发生什么吗?

我已将存储库上传到 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 格式将执行不同的操作。

需要进行两项更改:

  1. 具有 post slug 格式的 URL 需要映射到 posts#show 方法(会相应地修改(,并且
  2. 在您的网站上生成的任何指向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

最新更新