首先,我正在尝试做的一个例子:
如何在Rails 2.3.8中解决这个问题?
到目前为止,我有:
AboutsController
旨在提供半静态页面(希望关于不是复数!)map.root => :controller => "about"
。现在,当非登录用户转到http://www.abc.com
时,他会获得视图about/index
的内容。到目前为止一切都很好。
但是,当用户登录时,我希望products/index
视图应显示为相同的网址,即http://www.example.com
网址(而不是{{1} })
这在Rails 2.3.8中是否可行?
答案 0 :(得分:3)
最简洁的方法是使用名为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将停止并且永远不会运行该操作。这就是为什么它被称为过滤器。相反,它将尊重给定的渲染或重定向请求。
current_user
方法是大多数用户身份验证插件为您提供的常用帮助程序,如果没有当前用户,则通常为nil。因此,我们的过滤方法告诉rails重定向到某个路径,除非用户已登录。
这是处理这类事情的事实上的铁路方式。非常好的问题。
答案 1 :(得分:2)
这当然是可能的。您可以像这样有条件地渲染您需要的任何视图:
def index
if current_user
render :action => 'products', :controller => 'index'
else
render :action => 'index', :controller => 'about'
end
end
假设您使用Authlogic,Devise进行身份验证。无论您使用什么逻辑来确定用户是否已登录,都将进入条件。
答案 2 :(得分:1)
我看到很多网站通过重定向到/dashboard
来处理这个问题,以尽可能让内部应用程序保持清洁。不需要太过努力,仍然是根URL,尽管它显然是可能的,因为其他解决方案表明:)