2009-07-14 49 views
17

Tôi đang cố chia nhỏ trang web thành hai phần. Một trong đó nên sử dụng bố trí ứng dụng và một trong đó nên sử dụng bố trí quản trị. Trong application.rb của tôi, tôi đã tạo ra một chức năng như sau:Ruby on Rails - hiển thị bố cục

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

Và trong các bộ điều khiển nơi nó có thể là một hay khác tôi đặt

before_filter :admin_layout 

này hoạt động tốt đối với một số trang (nơi chỉ của nó văn bản) nhưng đối với những người khác tôi gặp phải lỗi cổ điển:

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 

Có ai có ý tưởng về những gì tôi bị thiếu không? Tôi nên sử dụng đúng cách hiển thị và bố cục như thế nào?

Trả lời

38

Phương pháp render thực sự sẽ cố gắng hiển thị nội dung; bạn không nên gọi nó khi tất cả những gì bạn muốn làm là đặt bố trí.

Rails có một khuôn mẫu cho tất cả điều này nướng trong Đơn giản chỉ cần vượt qua một biểu tượng để layout và phương pháp với tên đó sẽ được gọi để xác định cách bố trí hiện tại:.

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.

+1

nếu logged_in? và current_user.is_able_to ('siteadmin') vì current_user có thể là không nếu không đăng nhập! –

+0

@Reuben, đó là một điểm tốt; thêm. – molf

+0

Tôi có các kiểm tra khác trước dòng đó để kiểm tra xem người dùng có đăng nhập hay không. Điều đó thật tuyệt vời, tôi thậm chí không bao giờ nghĩ đến việc gọi một hàm sau khi bố cục. Rất đơn giản và rất hữu ích. Cảm ơn bạn. – RyanJM

5

có lẽ bạn cần kiểm tra xem người dùng đã đăng nhập trước chưa?

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

.nil? trên tuyên bố trừ khi dư thừa mặc dù – Gav

1

Có thể là do current_usernil khi người dùng chưa đăng nhập. Hãy kiểm tra .nil? hoặc khởi tạo đối tượng.

0

Hãy thử câu trả lời của molf với:

nếu logged_in? và current_user.is_able_to ('siteadmin')

0

người dùng hiện tại của bạn là properbly thiết lập trong sau khi người dùng đã đăng nhập. và trong trường hợp này, bạn nên có một tùy chọn để xác định xem bạn đã đăng nhập

như

if [email protected]_user.nil? 
    if @current_user.is_able_to("###") 
    render :layout => "admin" 
    else 
    render :layout => "application" 
    end 
end 

Sau đó, nó sẽ chỉ nhập câu lệnh if nếu @current_user của bạn không phải là không.

Các vấn đề liên quan