我希望用户能够在site.com/myNameHere上找到个人资料页面。 Rails查找名为“myNameHere”的控制器。是否可以设置routes.rb,以便在找不到控制器时,“myNameHere”作为参数发送给另一个控制器?
答案 0 :(得分:9)
您可以添加如下路线:
map.profile_link '/:username', :controller => 'profiles', :action => 'show'
请确保在资源下方的文件中添加足够低的值,以免它干扰其他路由。它应该是最低优先级。接下来,您需要更改show动作以使用用户名而不是id:
def show
@user = User.find_by_username(params[:username])
end
这就是它的全部。快乐的编码!
<强>更新强>
我已将此答案扩展为完整的博文Vanity URLs in Ruby on Rails Routes。我有其他代码示例和更全面的解释。
答案 1 :(得分:0)
我想我会为Rails 3更新这个。我的用户模型中有一个字段“网站”,它将充当虚荣路径,我将路由到每个虚荣路径的静态页面。如果调用虚荣路线,我想显示所有用户的事件。
#config/routes.rb
get '/:website', :controller => 'static_pages', :action => 'vanity'
#app/controllers/static_pages_controller.rb
def vanity
@user = User.find_by_website(params[:website])
if @user != nil #in case someone puts in a bogus url I redirect to root
@events = @user.events
else
redirect_to :root
end
end
#app/views/static_pages/vanity.html.erb
<h1><%= @user.website %> events</h1>
<table>
<tr>
<th>Title</th>
<th>Starts at</th>
<th>Description</th>
<th></th>
<th></th>
<th></th>
</tr>
<% @events.each do |event| %>
<tr>
<td><%= event.title %></td>
<td><%= event.starts_at %></td>
<td><%= event.description %></td>
</tr>
<% end %>
</table>
如果您不想使用宝石,我认为这是一个不错的选择。