2015-01-16 15 views
5

Tài liệu Sinatra nói rằng development? sẽ trả về đúng khi môi trường phát triển, nhưng tôi nhận được lỗi nói rằng phương pháp development? không xác định.Phương pháp Sinatra `phát triển? 'Không xác định

Tôi đã thử bỏ qua viết tắt và thử nghiệm biến số ENV['RAKE_ENV'], nhưng nó chỉ là không.

Đây là lỗi tôi nhận được:

undefined method `development?' for main:Object (NoMethodError) 

và đây là mã được kích hoạt các lỗi:

require 'dm-sqlite-adapter' if development? 

Tôi đang sử dụng các ứng dụng phong cách mô-đun. Dòng trên là một tệp riêng biệt chỉ quản lý mô hình. Chuyện gì vậy?

+1

Điều gì xảy ra nếu bạn sử dụng nó làm biểu tượng (có dấu hai chấm) yêu cầu "xyz" nếu: phát triển? –

+0

Đã sửa lỗi. Cảm ơn nhiều. Nếu bạn muốn đặt nó như là một câu trả lời, tôi sẽ vui lòng chấp nhận nó như là chính xác. Sự khác biệt giữa cú pháp biểu tượng và ký tự không phải là biểu tượng là gì? Làm cách nào để biết khi nào nên sử dụng? –

+2

@EmanueleFeliziani không sửa chữa '... if: any_symbol_whatsoever' sẽ luôn trả về true, vì ký hiệu không phải là' nil' hoặc 'false'. – matt

Trả lời

3

Tôi cũng gặp khó khăn với vấn đề này. Đây là những gì tôi khám phá trên đường đi.

Bạn cần phải là "bên trong" một lớp kế thừa từ Sinatra :: Base (như Sinatra :: Application, được thừa kế từ Base) để có thể sử dụng phương thức development?, được định nghĩa trong base.rb.

Trong ứng dụng Sinatra cổ điển, bạn đã mã hóa "bên trong" một lớp kế thừa từ Sinatra :: Base. Vì vậy, development? sẽ chỉ hoạt động "ở mọi nơi".

Trong mô-đun Sinatra các development? sẽ chỉ làm việc trong Sinatra :: Base tiểu học, chẳng hạn như:

require 'sinatra/base' 

# Placing 
# require 'dm-sqlite-adapter' if development? 
# here will not work. 

class ApplicationController < Sinatra::Base 
require 'dm-sqlite-adapter' if development? # But here it works 
... 
end 

# Placing 
# require 'dm-sqlite-adapter' if development?` 
# AFTER the above class will still not work 

class SomethingElse 
# nor will `development?` work here, since it is called inside 
# a class without Sinatra::Base inheritance 
... 
end 

Vì vậy, về cơ bản bạn có thể sử dụng một lớp ApplicationController được thừa kế từ Sinatra :: Base và bên đây kiểm tra cho development?. Cũng vậy với phụ lớp kế thừa từ lớp ApplicationController của bạn:

class UserController < ApplicationController 
    require 'dotenv' if development? 
    ... 
end 

Đối với mô-đun Sinatra, trong (chính: Object) mã văn bản "bên ngoài" Sinatra :: Base phụ lớp học, bạn cần phải làm theo Arup's hướng dẫn:

if Sinatra::Base.environment == :development 
    require 'awesome_print' 
    require 'dotenv' 
    Dotenv.load 
    ... 
end 
3

Vì bạn đang sử dụng kiểu mô-đun, bạn cần phải thêm không gian tên mô-đun Sinatra::Base trước khi phương pháp này.

Vì vậy, bạn sẽ có thể truy cập Sinatra::Base.development? ở bất cứ đâu trong ứng dụng.

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