Сохраните конфигурацию в файле, подобном Rails - PullRequest
3 голосов
/ 30 июля 2010

Я хочу выполнить то же самое, что сделал Rails, чтобы сохранить конфигурации в файлах rb, которые читаются приложением:

# routes.rb
MyApp::Application.routes.draw do |map|
  root :to => 'firstpage#index'
  resources :posts

В rails методы "root" и "resources" не определеныв объекте "main" scope.

Это означает, что эти методы определены либо в модуле, либо в классе.Но как они потребовали файл rout.rb и использовали эти методы из класса / модуля.

Потому что, если я использую «require», тогда эти методы будут выполняться в «основной» области, независимо от того, где язапустите "require".

Итак, как бы вы хотели, чтобы Rails прочитал этот файл конфигурации и запустил методы, определенные в классе / модуле?

Спасибо

Ответы [ 3 ]

3 голосов
/ 30 июля 2010

Нет способа эффективно сделать это. require требует содержимого файлов, точка. Это не предлагает никакого другого поведения. Решение eval уступает правильной записи ваших файлов Ruby, поэтому они содержат соответствующую информацию о пространстве имен. Если вы хотите включить поведение в несколько классов, используйте модули.

2 голосов
/ 30 июля 2010

Не совсем то, что я бы назвал доброкачественным кодом, но вот как вы могли бы это сделать:

class A
  eval(File.read('yourfile.rb'))
end
1 голос
/ 30 июля 2010

Ответ на ваши изменения заключается в том, что рельсы не использовали yield или Proc#call в методе draw. Вероятно, он использовал instance_eval или class_eval .

(Правка) Например, вот как можно определить метод draw:

def draw(&blk)
  class << context = Object.new
    def root(p1, p2)
      # ...
    end
    def resources(p1, p2)
      # ...
    end
  end
  context.instance_eval(&blk)
end

Тогда вы можете использовать это так:

draw do
  root 2, 3
  resources 4, 5
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...