2015-08-20 2 views
1

Класс нуждается в использовании EWKB в различных действиях контроллера, таким образом, определяется:Рельсов: Назначить константу, которая может быть использована во всех контроллерах

def EWKB 
    EWKB = RGeo::WKRep::WKBGenerator.new(:type_format => :ewkb, :emit_ewkb_srid => true, :hex_format => true) 
end 

def self.containing_latlon(lat, lon, polygon) 
    ewkb = EWKB.generate(FACTORY.point(lon, lat).projection) 
    where("ST_Intersects(polygon, ST_GeomFromEWKB(E'\\\\x#{ewkb}'))") 
end 

В приведенном выше определении, возвращает syntax error: dynamic constant assignment. Вместо него я определил

def EWKB 
    RGeo::WKRep::WKBGenerator.new(:type_format => :ewkb, :emit_ewkb_srid => true, :hex_format => true) 
end 

и ошибка исчезает. Поскольку второй метод должен ссылаться на него, я не уверен, как/если рубин будет обрабатывать этот конструктор, как

def self.containing_latlon(lat, lon, polygon) 
    EWKB = RGeo::WKRep::WKBGenerator.new(:type_format => :ewkb, :emit_ewkb_srid => true, :hex_format => true) 
    ewkb = EWKB.generate(FACTORY.point(lon, lat).projection) 
    where("ST_Intersects(polygon, ST_GeomFromEWKB(E'\\\\x#{ewkb}'))") 
end 

приводит к тому же месту

ответ

1

конвенций Follow именования. Константы: CamelCase, имена методов и переменных: snake_case. Переводчик сходит с ума, пытаясь понять, чего вы хотите. Просто определить константу в вашем application_controller.rb:

EWKB = RGeo::WKRep::WKBGenerator.new(:type_format => :ewkb, :emit_ewkb_srid => true, :hex_format => true) 

И затем использовать его.

Другой способ заключается в определении метода:

class ApplicationController < ActionController::Base 
    def self.ewkb 
    # caching the assignment 
    @ewkb ||= RGeo::WKRep::WKBGenerator.new(:type_format => :ewkb, :emit_ewkb_srid => true, :hex_format => true) 
    end 
end 

class MyController < ApplicationController 
    def my_action 
    ApplicationController.ewkb 
    end 
end 

Используйте то, что вам нравится, просто не смешивать их.

Смежные вопросы