如何设置路由以使用命名空间在URL中显示其他信息?

时间:2011-02-13 01:10:14

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

我正在运行Ruby on Rails 3,我想设置我的路由以使用命名空间在URL中显示其他信息。

在routes.rb文件中,我有:

namespace "users" do
  resources :account
end

因此,显示帐户页面的网址为:

http://<site_name>/users/accounts/1

我想将该网址重写/重定向为

http://<site_name>/user/1/Test_Username

其中“Test_username”是用户的用户名。此外,我想重定向所有网址,如

# "Not_real_Test_username" is a bad entered username of the user.
http://<site_name>/users/accounts/1/Not_real_Test_username

以上。


此时我解决了部分问题:

  scope :module => "users" do
    match 'user/:id' => "accounts#show"
  end

2 个答案:

答案 0 :(得分:0)

最好在控制器中执行此操作,因为您需要检索帐户以获取用户名:

@account = Account.find(params[:id])
if @account && @account.username
  redirect_to("/user/#{@account.id}/#{@account.username}")
  return
end

关于第二个问题,您可以通过在路线中定义剩余参数来捕获剩余参数:

get "/users/accounts/:id(/:other)" => "users/accounts#show"

这样的地图如下:

/users/accounts/1/something # => {:id => "1", :other => "something"}
/users/accounts/1 # => {:id => "1"}

您可以忽略控制器中的:other键。

答案 1 :(得分:0)

我很抱歉没有回答你的问题(@zetetic已经做得很好了),但这里的最佳做法是保持在RESTful风格的Rails URL方案中,除了极少数例外。大多数人以这种方式制作漂亮网址的方式是使用连字符,例如:

/accounts/1-username

这不需要任何路由更改。只需实施:

class Account < ActiveRecord::Base
  def to_param
    "#{self.id}-#{self.username}"
  end
end

通过调用to_i来处理查找中的额外字符串数据。

class AccountController < ApplicationController
   def show
     @account = Account.find(params[:id].to_i)
   end
end

执行link_to 'Your Account', account_path(@account)时,Rails会自动生成漂亮的网址。