我希望它类似于Twitter处理其推文的网址的方式。
例如,现在我的网址如下所示:mydomain.com/feedbacks/1/
,其中feedbacks
是控制器的名称。
我希望它看起来像:mydomain.com/username/feedbacks/1/
,类似于Twitter:twitter.com/username/status/:id/
。
我的routes.rb
看起来像这样:
resources :users do
resources :feedbacks
end
如果我这样,它会将网址设为mydomain.com/users/1/feedbacks
,但我想要网址中的实际用户名。
我如何得到它?
感谢。
编辑1:如果您要为此问题添加另一个答案,请确保它针对已给出的答案解决我的意见/问题。否则它将是多余的。
答案 0 :(得分:5)
scope ":username" do
resources :feedbacks
end
来自docs:
这将为您提供/ bob / posts / 1等URL,并允许使用 您将路径的用户名部分引用为params [:username] in 控制器,帮助者和观点。
更新:
我已经测试并确认了paozac answer的准确性。我会稍微澄清一下。
假设您有一个@feedback
个id
12
个username
对象,相关用户的foouser
为@feedback
。如果要为该edit_feedback_url(:username => @feedback.user.username, :id => @feedback)
对象的编辑页面生成URL,可以执行以下操作:
"/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"
。
edit_feedback_url(@feedback.user.username, @feedback)
此外,正如nathanvda在评论中所指出的,您可以pass ordered arguments与相应的动态细分相匹配。在这种情况下,必须首先传递用户名,并且反馈ID应该在第二个传递,即:
{{1}}
此外,如果您需要帮助处理来自控制器的参数,我建议创建一个特定于此的新问题。
答案 1 :(得分:2)
一旦你定义了像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