将 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 添加到 User
和 Post
就可以让它变成 http://localhost:3000/username621/posts/title-of-post
但是,您需要仔细研究代码库以了解 member_post_path(post)
之类的内容并更改为 member_post_path(post.user, post)
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 添加到 User
和 Post
就可以让它变成 http://localhost:3000/username621/posts/title-of-post
但是,您需要仔细研究代码库以了解 member_post_path(post)
之类的内容并更改为 member_post_path(post.user, post)