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

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

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

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

我的routes.rb看起来像这样:

  resources :users do resources :feedbacks end 

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

我怎么做到的?

谢谢。

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

 scope ":username" do resources :feedbacks end 

来自文档 :

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


更新:

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

假设您有一个id12@feedback对象,并且关联用户的username foouser 。 如果要生成该@feedback对象的编辑页面的URL,可以执行以下操作:

 edit_feedback_url(:username => @feedback.user.username, :id => @feedback) 

输出将是"/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" 

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

 edit_feedback_url(@feedback.user.username, @feedback) 

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

一旦你定义了像dwhalen这样的范围,你可以像这样生成url:

 feedbacks_url(:username => 'foo') 

得到

 http://www.example.com/foo/feedbacks 

要么

 edit_feedback_url(:username => 'foo', :id => 1) 

得到

 http://www.example.com/foo/feedbacks/1/edit