如何在Rails 3.1中将我的URL格式设置为username/controller /:id?

mar*_*ion 1 routing ruby-on-rails rails-routing ruby-on-rails-3

我希望它类似于Twitter处理其推文的URL的方式.

例如,现在我的URL看起来像这样:mydomain.com/feedbacks/1/,feedbacks控制器的名称在哪里.

我希望它看起来像:mydomain.com/username/feedbacks/1/类似于Twitter的:twitter.com/username/status/:id/.

routes.rb看起来像这样:

  resources :users do
      resources :feedbacks
  end
Run Code Online (Sandbox Code Playgroud)

当我这样的时候,它会给我URL mydomain.com/users/1/feedbacks,但我想要URL中的实际用户名.

我怎么做到的?

谢谢.

编辑1:如果您要为此问题添加另一个答案,请确保它针对已给出的答案解决我的意见/问题.否则它将是多余的.

dwh*_*len 5

scope ":username" do
  resources :feedbacks
end
Run Code Online (Sandbox Code Playgroud)

来自文档:

这将为您提供诸如/ bob/posts/1之类的URL,并允许您在控制器,帮助程序和视图中引用路径的用户名部分作为params [:username].


更新:

我已经测试并确认了paozac 答案的准确性.我会稍微澄清一下.

假设你有一个@feedback与对象id12,以及相关的用户有一个usernamefoouser.如果要生成该@feedback对象的编辑页面的URL ,可以执行以下操作:

edit_feedback_url(:username => @feedback.user.username, :id => @feedback)
Run Code Online (Sandbox Code Playgroud)

输出将是"/foouser/feedbacks/12/edit".

# A URL to the show action could be generated like so:
feedback_url(:username => feedback.user.username, :id => feedback)
#=> "/foouser/feedbacks/12"
# New
new_feedback_url(:username => current_user.username)
#=> "/foouser/feedbacks/new"
Run Code Online (Sandbox Code Playgroud)

此外,正如nathanvda在注释中所指出的,您可以传递与相应动态段匹配的有序参数.在这种情况下,必须首先传递用户名,并且应该传递反馈ID,即:

edit_feedback_url(@feedback.user.username, @feedback)
Run Code Online (Sandbox Code Playgroud)

此外,如果您需要帮助处理来自控制器的参数,我建议创建一个特定于此的新问题.