2013-08-21 32 views
10

tôi muốn thực hiện một phương pháp bên trong một mô-đun (đối với nhóm nguyên nhân) có thể được gọi là một module.method, một cái gì đó như thế này:Làm thế nào để làm cho helper mô-đun trong Sinatra

helpers do 
    module UserSession 
    def logged_in? 
     not session[:email].nil? 
    end 
    def logout! 
     session[:email] = nil 
    end 
    end 
end 

nhưng khi tôi cố gắng để gọi nó là sử dụng UserSession.logged_in? nó nói rằng logged_in không phải là phương pháp của UserSession

phương thức chưa xác định `logged_in? ' cho UserSession: Module

khi tôi di chuyển phương pháp như phương pháp UserSession của:

helpers do 
    module UserSession 
    def self.logged_in? 
     not session[:email].nil? # error 
    end 
    def self.logout! 
     session[:email] = nil 
    end 
    end 
end 

nó mang lại cho một lỗi, mà tôi không thể truy cập vào session biến

biến địa phương không xác định hoặc phương pháp `phiên 'cho UserSession: Mô-đun

solutio tốt nhất là gì n cho vấn đề này?

+0

'bao gồm UserSession'? – shime

+0

vì vậy, bạn ngụ ý rằng tôi nên làm cho mô-đun bên ngoài phương pháp giúp đỡ của Sinatra, sau đó bao gồm nó? nó sẽ có cùng một vấn đề (không thể truy cập biến session) – Kokizzu

Trả lời

5

Bạn có thể sử dụng một quy ước khác cho phương thức helpers.

module UserSession 
    def logged_in? 
    not session[:email].nil? 
    end 
    def logout! 
    session[:email] = nil 
    end 
end 

helpers UserSession 

get '/foo' do 
    if logged_in? 
    'Hello you!' 
    else 
    'Do I know you?' 
    end 
end 

Định nghĩa mô-đun tất nhiên có thể nằm trong tệp khác (require d).

Phía sau hậu trường, helpers <Module> đang thực hiện include, nhưng không chỉ đơn giản là vào lớp con ứng dụng Sinatra mà bạn đang sử dụng cho ứng dụng của mình. Các include cần phải được thực hiện tương thích với cách get, post vv làm việc kỳ diệu của họ, và helpers làm điều đó cho bạn.

+0

không, tôi muốn gọi phương thức với tên mô-đun quá .. 'UserSession.logged_in?' – Kokizzu

+1

@Kokizzu: Điều đó có thể xảy ra, nhưng tôi không chắc chắn cách thức bên trong Khung Sinatra. Phương thức cần truy cập trạng thái của yêu cầu. –

+0

@Kokizzu "tôi cũng muốn gọi phương thức với tên mô-đun .. UserSession.logged_in?" - tại sao? – iain

2

nevermind, tôi tìm thấy câu trả lời, tôi đã cố gắng define_method('UserSession.logged_in?') cũng có, nhưng không có may mắn

điều cuối cùng tôi đã cố gắng là:

# outside helpers 
class UserSession 
    @@session = nil 
    def initialize session 
    @@session ||= session 
    end 
    def self.check 
    throw('must be initialized first') if @@session.nil? 
    end 
    def self.logged_in? 
    self.check 
    not @@session[:email].nil? 
    end 
    def self.logout 
    self.check 
    @@session.delete :email 
    end 
end 

nhưng một cái gì đó phải được gọi đầu tiên

before // do 
    UserSession.new session 
end 

thì có thể sử dụng như mong muốn:

get '/' do 
    if UserSession.logged_in? 
    # do something here 
    end 
end 
+1

Nếu điều này được dự định để móc vào mã bảo mật hoặc quyền sở hữu, bạn có lẽ cũng nên thêm khối 'after //' biến phiên được lưu trữ. Khác nó cũng có thể tồn tại trong yêu cầu tiếp theo trên cùng một quy trình (trong trường hợp đơn giản ở đây sẽ vô hại và được ghi đè lên yêu cầu tiếp theo, nhưng nó là một dữ liệu nguy hiểm để treo xung quanh). –

+0

có, đây là một vấn đề thực sự .. khi tôi làm hai yêu cầu cùng một lúc, nó cho thấy rằng biến tĩnh cũ chưa được xóa ..> ___ < – Kokizzu

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