1

我希望它类似于 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

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

我怎么得到它?

谢谢。

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

4

2 回答 2

5
scope ":username" do
  resources :feedbacks
end

文档

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


更新:

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

假设您有一个@feedback带有idof的对象12,并且关联的用户有一个usernameof 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)

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

于 2011-09-04T05:15:34.887 回答
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
于 2011-09-08T15:55:54.613 回答