Использование Rails Маршруты через ERB в файле YAML - PullRequest
2 голосов
/ 05 сентября 2011

Это действительно начинает сводить меня с ума;Я потратил целых два часа на это, и я просто не могу понять это!Я пытаюсь использовать ERB в файле YAML, чтобы включить маршрут рельсов в файл YAML.Короче говоря, это будет прочитано позже, чтобы создать семантическое меню из файла YAML.Я загружаю файл YAML (с ERB) в инициализатор _load_config.rb и код, который загружает его, выглядит так:

menu_yml= "#{Rails.root}/config/menu.yml"
config = YAML.load(ERB.new(IO.read(menu_yml)).result)
MENU_CONFIG = config

В файле YAML menu.yml у меня есть что-то такое:

logged_in:
  dashboard:
    text: "Dashboard"
    url: <%= url_for dashboard_path %>

Проблема в том, что <%= url_for hasboard_path %> выбрасывает и выдает ошибку:

(erb):4:in `<main>': undefined local variable or method `dashboard_path' for main:Object (NameError)

Из-за большой отладки я предполагаю, что это связано с загрузкой маршрутов после этого инициализатора.Любые предложения относительно того, как это исправить, очень ценятся!

PS Это использует Rails 3.1.rc5

1 Ответ

1 голос
/ 07 сентября 2011

Причина, по которой вы получаете эту ошибку, заключается в том, что url_for является помощником для ActionView и поэтому недоступен при запуске инициализатора - он не будет работать при вызове из моделей или консоли, поэтому проблема не обязательно заключается в том, что маршруты загружаются после этого инициализатора .


Я не уверен точно, как настроен маршрут вашей панели мониторинга и почему его необходимо динамически привязать к menu.yml. Предполагается, что через URL-адрес не отправляются никакие параметры (поскольку аргументы не передаются в url_for '), и вы используете match для маршрутизации: Наличие глобальной переменной или переменной среды, на которую ссылается routes.rb и menu.yml могут дать необходимую вам функциональность.

boot.rb

require 'rubygems'

DASHBOARD_URL = '/dashboard'
...

rout.rb

match DASHBOARD_URL => 'dashboard#index'

menu.yml

logged_in:
  dashboard:
    text: "Dashboard"
    url: DASHBOARD_URL
...