【问题标题】:Change Rails namespaced route to personalized params route将 Rails 命名空间路由更改为个性化参数路由
【发布时间】:2015-05-12 03:05:21
【问题描述】:

TL;DR:我想要username621/posts/title-of-post 而不是member/posts/1

将帖子 id 更改为帖子 title 非常简单,因为我使用了 freindly_id gem 来生成 slug。

但是,我在路由到个性化参数路由而不是当前命名空间路由时遇到了困难。这是当前的路线:

namespace :member do
    resources :posts
end

我想将member 命名空间替换为用户的username。所以如果他们的用户名是user123,那么路由应该是user123/posts/title-of-post

我认为这不是很标准的 Rails 路由,并尝试寻找类似的问题但没有结果。

【问题讨论】:

    标签: ruby-on-rails routing rails-routing


    【解决方案1】:

    对于更复杂的routes.rb,添加path 选项

    namespace :member, path: ":user_id" do
      resources :posts
    end
    

    应该得到你想要的,例如http://localhost:3000/621/posts/1

    那么我们只需将friendly_id 添加到UserPost 就可以让它变成http://localhost:3000/username621/posts/title-of-post 之类的东西

    但是,您需要仔细研究代码库以查找 member_post_path(post) 之类的内容,然后更改为 member_post_path(post.user, post)

    【讨论】:

      【解决方案2】:

      尝试删除 namespace 并添加 path 选项:

      resources :posts, path: '/:username/posts/'
      

      然后,如果您在控制器中访问/username621/posts/title-of-post,您将看到params[:username] = 'username621'

      如果你还有/something/posts形式的其他路径,请将它们添加到此路由上方,否则它们将被:username捕获。

      【讨论】:

      • 感谢您的回答。我正在尝试您的解决方案,因为实际路线比发布的答案复杂得多,并且需要一些时间。将在一段时间内确认这是否有效。
      猜你喜欢
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      相关资源
      最近更新 更多