如何从控制器路由 Rails 4 获得不同的和多个视图

Posted

技术标签:

【中文标题】如何从控制器路由 Rails 4 获得不同的和多个视图【英文标题】:How to get to different and multiple view from controller route Rails 4 【发布时间】:2015-01-18 00:42:33 【问题描述】:

我正在将我制作的 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

【问题讨论】:

【参考方案1】:

你完全可以这样做:

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/。

【讨论】:

太棒了!您的第一个建议效果很好。我也很感谢你提到更流行的约定;我现在正在研究名称间距。谢谢!【参考方案2】:

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

【讨论】:

以上是关于如何从控制器路由 Rails 4 获得不同的和多个视图的主要内容,如果未能解决你的问题,请参考以下文章

rails如何从命令行调用运行本地服务器的控制器操作[重复]

如何在 Rails 4 中使用关注点

Rails 4 RoutingError:没有路由匹配 [POST]

如何使用Paperclip在Rails 4中上传多个图像

如何在 Rails 4 中测试控制器关注点

GET 和 POST 请求的相同 Rails 4 路由