如何在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 答案的准确性。 我会稍微澄清一下。
假设您有一个id
为12
的@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