我正在运行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
答案 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会自动生成漂亮的网址。