【问题标题】:Ruby on Rails - render layoutRuby on Rails - 渲染布局
【发布时间】:2010-11-10 19:33:36
【问题描述】:

我正在尝试将网站分成两个部分。一种应该使用应用程序布局,另一种应该使用管理布局。在我的 application.rb 中,我创建了如下函数:

def admin_layout
  if current_user.is_able_to('siteadmin')
    render :layout => 'admin'
  else
    render :layout => 'application'
  end
end

在我放置的控制器中可能是一个或另一个

before_filter :admin_layout

这适用于某些页面(其中只是文本),但对于其他页面,我会遇到经典错误:

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

有人知道我缺少什么吗?应该如何正确使用渲染和布局?

【问题讨论】:

    标签: ruby-on-rails layout render


    【解决方案1】:

    render 方法实际上会尝试渲染内容;当您想要做的只是设置布局时,您不应该调用它。

    Rails 有一个包含所有这些的模式。只需将一个符号传递给layout,就会调用具有该名称的方法以确定当前布局:

    class MyController < ApplicationController
      layout :admin_layout
    
      private
    
      def admin_layout
        # Check if logged in, because current_user could be nil.
        if logged_in? and current_user.is_able_to('siteadmin')
          "admin"
        else
          "application"
        end
      end
    end
    

    See details here.

    【讨论】:

    • 如果已登录?和 current_user.is_able_to('siteadmin') as current_user 如果未登录,可能为 nil!
    • 我在该行之前还有其他检查来检查用户是否已登录。不过这太棒了,我什至从未想过在布局之后调用函数。如此简单,非常有帮助。谢谢。
    • 对于那些正在检查的人。我应该做更多的研究:apidock.com/rails/ActionController/Layout/ClassMethods/layout 第一条评论会回答我的问题。
    • @molf 答案中的链接已损坏
    【解决方案2】:

    也许您需要先检查用户是否已登录?

    def admin_layout
      if current_user and current_user.is_able_to 'siteadmin'
        render :layout => 'admin'
      else
        render :layout => 'application'
      end
    end
    

    【讨论】:

    • .nil?尽管在除非语句上是多余的
    【解决方案3】:

    这可能是因为current_user 在用户未登录时是nil。要么测试.nil?,要么初始化对象。

    【讨论】:

      【解决方案4】:

      试试 molf 的回答:

      如果已登录?和 current_user.is_able_to('siteadmin')

      【讨论】:

        【解决方案5】:

        您的当前用户在用户登录后正确设置。在这种情况下,您应该有一个选项来确定您是否已登录

        喜欢

         if !@current_user.nil?
           if @current_user.is_able_to("###")
             render :layout => "admin"
           else
            render :layout => "application"
           end
         end
        

        那么它只会在你的@current_user 不是 nil 的情况下进入 if 语句。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-24
          • 2017-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-24
          • 2018-05-05
          相关资源
          最近更新 更多