如何从控制器路由 Rails 4 到达不同的多个视图

How to get to different and multiple view from controller route Rails 4

我正在将我制作的 Sinatra 应用程序移回 Rails 4. 在我的 Sinatra 应用程序中,我有一个名为 "logged_in" 的帮助程序,如果用户已登录则返回 true 并且否则返回 false。然后在我的路线中我有以下...

get '/' do
  if logged_in
    erb :"admin/a_index"
  else
    erb :index
  end
end

get '/about' do
  if logged_in
    erb :"admin/a_about"
  else
    erb :about
  end
end

get '/contact' do
  if logged_in
    erb :"admin/a_contact"
  else
    erb :contact
  end
end

因此,如果用户已登录,它将为该特定静态页面呈现不同的管理视图(位于子文件夹中)。如果用户没有登录,它将呈现一个默认的静态页面。

如何在 Rails 4 中实现它?

我是否必须指定额外的管理路由,或者我是否可以执行类似以下操作...?

class PagesController < ApplicationController

  def home
    if logged_in
      render #admin_home
    else
      render #home
    end
  end

  def about
    if logged_in
      render #admin_about
    else
      render #about
    end
  end

  def contact
    if logged_in
      render #admin_contact
    else
      render #contact
    end
  end
end

只有以下路线...

Rails.application.routes.draw do
  root 'pages#home'
  get '/home' => 'pages#home'
  get '/about' => 'pages#about'
  get '/contact' => 'pages#contact'

  get '/signup' => 'users#new'
  post '/users' => 'users#create'

  get '/login' => 'sessions#new'
  post '/login' => 'sessions#create'
  get '/logout' => 'sessions#destroy'
end

答案是否定的。 Render 只渲染一个特定的页面,它不调用任何新的路由。这就是 redirect_to 所做的:它调用了一条全新的路线。您可以为应用程序中的任何视图调用 render,只要您有正确的实例变量使其正确显示即可。

你完全可以做到:

if logged_in?
  render  'admin/index'
else
  render 'index'
end

但是我在 Rails 中看到的约定是为控制器和视图设置一个管理命名空间。如果您使用的是 Devise,它 looks like 您可以像这样编写已签名的路由:

authenticated do
  get '/home' => 'admin/pages#home'
end

当然,这意味着您必须为未登录的用户指定相同的路由。但是你会有一个单独的控制器(contorllers/admin 中的 AdminPagesController)和管理员操作,以防你需要加载不同的数据。然后视图将进入 views/admin/.