将 Rails 命名空间路由更改为个性化参数路由

Change Rails namespaced route to personalized params route

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

将 post id 更改为 post title 很容易,因为我使用了 freindly_id gem 来生成 slug .

但是,我很难路由到个性化的参数路由,而不是当前的命名空间路由。这是当前路由:

namespace :member do
    resources :posts
end

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

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

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

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

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

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

对于更复杂的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)