روبي على القضبان - تقديم تخطيط
-
13-09-2019 - |
سؤال
أحاول تقسيم موقع ويب إلى قسمين. والتي يجب استخدام تخطيط التطبيق وواحدة يجب استخدام تخطيط المسؤول. في تطبيقي، قمت بإنشاء وظيفة كما يلي:
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 في لا شيء.