如何让多个路径以root身份显示URL

时间:2012-03-26 22:31:10

标签: ruby-on-rails

我希望users#newtasks#index显示为根路径网址,即/当用户登录路径users#new(设置为root)时,它们是重定向到tasks#index,网址不会更改。可以在routes.rb文件中完成吗?

这是我的routes.rb文件:

Todo::Application.routes.draw do
  resources :sessions 
  resources :subscriptions
  resources :users
  resources :tasks do
    collection do
      post :sort
    end
  end
  root :to => "users#new"
  match "sessions#new" => "tasks#index"
  match "sessions#" => "tasks#index"

2 个答案:

答案 0 :(得分:1)

我不确定我是否会这样做,但假设您映射了根任务#index,您还可以使用before filter在用户未登录时呈现会话#new模板:

class TasksController < ApplicationController

  before_filter :authorize_access

  def authorize_access
    unless logged_in?
      render :template => 'sessions/new'
      return false  #I don't remember if you need this still or not
    end
  end

  def index
    @tasks = Task.all
  end

end

要明确的是,当用户请求“/”时,Rails会将此请求路由到单个控制器和操作。您可以将多个路径映射到同一个控制器/操作,但是单个路径对于特定的控制器/操作是确定的。 IOW - 在路由中逻辑上不可能对任何路径,root或其他路径有get请求,转到多个控制器/操作。

用户看不到控制器和操作,他们看到操作呈现的结果,通常基于某个模板,并且您可以在操作(或控制器过滤器)逻辑中确定,如上所述

您还可以创建第三个控制器,一个RootController,其中包含显示任务列表的逻辑或基于用户是否登录的登录页面。

答案 1 :(得分:1)

我刚刚通过约束找到路线定义

您的routes.rb文件中的

class LoggedInConstraint
  def initialize(value)
     ...
  def matches?(request)
      request.cookies.key?("user_token") == @value
    end
  end
end

RedmineApp::Application.routes.draw do
  root :to => "static#home", :constraints => LoggedInConstraint.new(false)
  root :to => "users#show", :constraints => LoggedInConstraint.new(true)
  ....
end

这里描述: http://collectiveidea.com/blog/archives/2011/05/31/user-centric-routing-in-rails-3/