Rails:显示同一URL的不同视图?

首先,我要做的一个例子:

  1. 如果您访问http://www.meetup.com而您尚未登录,则会看到显示“做某事•了解某事……”等页面,这是一个公共页面
  2. 但是当您登录时,同一页面(URL)显示“欢迎,xxx ……发生了什么……”等特定于您。
    这也是我在我的应用程序中尝试做的事情。

如何在Rails 2.3.8中解决这个问题?

到目前为止,我有:

  1. 一个AboutsController旨在提供半静态页面(希望关于不是复数!)
  2. 根路由是map.root => :controller => "about"

现在,当一个未登录的用户 http://www.abc.com ,他将获得about/index的视图about/index 。 到现在为止还挺好。

但是,当用户登录时 ,我希望products/index视图应显示为相同的URL,即http://www.example.com URL(而不是http://www.example.com/products

这在Rails 2.3.8中是否可行?

最简洁的方法是使用名为before_filter的东西。 它是控制器顶部的一个命令,在该控制器中的任何操作(您想要的)之前调用。 通常,您需要对控制器中的多个操作执行相同的检查,因此将该检查直接放入每个操作中是没有意义的。

假设您有一个评论控制器,并且您希望编辑,更新和销毁操作只是登录用户可以执行的操作。 这很常见。 我们来看一个例子。 为了简洁起见,我不会拼出所有的控制器动作,只是单独的东西:

 class CommentsController < ApplicationController before_filter :user_logged_in?, :only => [:edit, :update, :destroy] # all your actions would go here - index, show, etc # protected def user_logged_in? redirect_to dashboard_path unless current_user end end 

在上面的例子中, user_logged_in? 方法将在运行编辑,更新或销毁操作之前运行。 如果在该方法中调用渲染或重定向,则rails将停止并且永远不会运行该操作。这就是为什么它被称为filter。 而是会尊重给定的渲染或重定向请求。

current_user方法是大多数用户身份validation插件为您提供的常见帮助程序,如果没有当前用户,则通常为nil。 所以我们的过滤方法告诉rails重定向到某个路径, 除非用户登录。

这是处理这类事情的事实上的铁路方式。 非常好的问题。

这当然是可能的。 您可以像这样有条件地渲染您需要的任何视图:

  def index if current_user render :action => 'products', :controller => 'index' else render :action => 'index', :controller => 'about' end end 

假设您使用Authlogic,Devise进行身份validation。 无论您使用什么逻辑来确定用户是否已登录,都将进入条件。

我已经看到很多网站通过重定向到/dashboard例如/dashboard来处理这个问题,以尽可能保持内部应用程序的清洁。 不需要太过深思熟虑它仍然是根URL,尽管它显然是可能的,因为其他解决方案表明:)