如何从控制器路由 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如何从命令行调用运行本地服务器的控制器操作[重复]