【问题标题】:How do I get the format of my URLs to be username/controller/:id in Rails 3.1?如何在 Rails 3.1 中将我的 URL 格式设置为 username/controller/:id?
【发布时间】:2011-09-04 03:25:28
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:
    scope ":username" do
      resources :feedbacks
    end
    

    来自docs

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


    更新:

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

    假设您有一个 @feedback 对象,其 id12,关联用户的 usernamefoouser。如果您想为该 @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 在 cmets 中所指出的,您可以 pass ordered arguments 将与相应的动态段匹配。在这种情况下,必须先传递用户名,然后再传递反馈id,即:

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

    另外,如果您在处理来自控制器的参数时需要帮助,我建议您针对该问题创建一个新问题。

    【讨论】:

    • 它有效,但最后一件事是,我如何链接到它?我尝试了feedbacks_path(feedback),它生成了常规的domain.com/:id/feedbacks URL。此外,在我有路径的索引页面上,如果我有edit_feedback_path(feedback),它会给我这个路由错误:No route matches {:action=>"edit", :controller=>"feedbacks",,但如果我将edit_feedbackS_path 复数,我会收到这个错误undefined method 'edit_feedbacks_path' for。我做错了什么?
    • 从命令行运行 'rake routes' 以获取应用的所有路由。
    • 这里是rake routes 输出:gist.github.com/1193147。如果命名路由(即edit_feedback_path 等)没有处理路由前缀的方法,您始终可以自己编写它们:"#{@user.username}/feedbacks/new 或将其提取到以用户或用户名作为输入的辅助方法中。
    • nathanvda 谢谢你!有意义的是,有序参数与相应的动态段相关联。 _url_path 是可选的(默认为 _url)。 github.com/rails/rails/blob/master/actionpack/lib/…
    • 对不起,应该是feedback_url(:username => feedback.user.username, :id => feedback)
    【解决方案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
    

    【讨论】:

    • 删除操作会是什么样子?在我有这个之前:<%= link_to 'Delete', feedback, confirm: 'Are you sure?', method: :delete %> 但是现在给了我这个错误:(No route matches {:action=>"show", :controller=>"feedbacks", :username=>#<Feedback id: 1, poster_id: 1, receiver_id: 2, content: "Test 2 is awesome", created_at: "2011-09-10 23:00:32", updated_at: "2011-09-10 23:00:32">})
    • 你可以使用feedback_url(:username => 'foo' :id => feedback.id), :method => :delete
    猜你喜欢
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多