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

时间:2011-09-04 03:25:29

标签: ruby-on-rails ruby-on-rails-3 routing rails-routing

我希望它类似于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:如果您要为此问题添加另一个答案,请确保它针对已给出的答案解决我的意见/问题。否则它将是多余的。

2 个答案:

答案 0 :(得分:5)

scope ":username" do
  resources :feedbacks
end

来自docs

  

这将为您提供/ bob / posts / 1等URL,并允许使用   您将路径的用户名部分引用为params [:username] in   控制器,帮助者和观点。


更新:

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

假设您有一个@feedbackid 12username对象,相关用户的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