Rails:显示同一URL的不同视图?
首先,我要做的一个例子:
- 如果您访问http://www.meetup.com而您尚未登录,则会看到显示“做某事•了解某事……”等页面,这是一个公共页面
- 但是当您登录时,同一页面(URL)显示“欢迎,xxx ……发生了什么……”等特定于您。
这也是我在我的应用程序中尝试做的事情。
如何在Rails 2.3.8中解决这个问题?
到目前为止,我有:
- 一个
AboutsController
旨在提供半静态页面(希望关于不是复数!) - 根路由是
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,尽管它显然是可能的,因为其他解决方案表明:)