سؤال

أحاول تقسيم موقع ويب إلى قسمين. والتي يجب استخدام تخطيط التطبيق وواحدة يجب استخدام تخطيط المسؤول. في تطبيقي، قمت بإنشاء وظيفة كما يلي:

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

هل لدى أي شخص فكرة عما أفتقده؟ كيف يجب أن أستخدم العروس والتخطيط بشكل صحيح؟

هل كانت مفيدة؟

المحلول

طريقة render سيحاول فعلا تقديم المحتوى؛ يجب أن لا تسميها عند تعيين كل ما تريد القيام به.

القضبان لديها نمط لكل هذا مخبوز. ما عليك سوى تمرير رمز ل 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

انظر التفاصيل هنا.

نصائح أخرى

ربما تحتاج إلى التحقق من توقيع المستخدم أولا؟

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

قد يكون بسبب current_user هو nil عند عدم تسجيل المستخدم. إما اختبار ل .nil? أو تهيئة الكائن.

جرب إجابة مولف مع:

إذا logged_in؟ و current_user.is_able_to ('siteadmin')

المستخدم الحالي الخاص بك هو تعيين متماغة في ما بعد تسجيل الدخول. وفي هذه الحالة يجب أن يكون لديك خيار لتحديد ما إذا كنت قد قمت بتسجيل الدخول

مثل

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

ثم لن يدخل فقط في بيان إذا كان لديك acurrent_user في لا شيء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top