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

时间:2010-10-22 00:56:58

标签: ruby-on-rails

首先,我正在尝试做的一个例子:

  1. 如果您转到http://www.meetup.com而您尚未登录,则会看到显示“做某事•了解某事......”等页面,这是一个公共页面
  2. 但是当你登录时,同一页面(URL)显示'欢迎,xxx ......发生了什么......'等特定于你。
    这就是我想要的也可以在我的应用中使用。
  3. 如何在Rails 2.3.8中解决这个问题?

    到目前为止,我有:

    1. AboutsController旨在提供半静态页面(希望关于不是复数!)
    2. 根路线为map.root => :controller => "about"
    3. 现在,当非登录用户转到http://www.abc.com时,他会获得视图about/index的内容。到目前为止一切都很好。

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

      这在Rails 2.3.8中是否可行?

3 个答案:

答案 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,尽管它显然是可能的,因为其他解决方案表明:)