Использование помощника image_path в настраиваемом файле yml.erb в каталоге конфигурации, написанном через настраиваемый инициализатор

Я создал файл yml.erb, который будет использоваться для настройки некоторых частей моего приложения. Я хотел бы предварительно загрузить его с помощью инициализатора (я не требую его изменения во время работы приложения), самая большая проблема заключается в том, что этот yml-файл содержит ссылку на изображения, которые находятся внутри каталога app / assets / images. Я хотел бы использовать помощник image_path внутри своего файла yml.erb, но у меня проблемы (я не знаю, что мне включить и где это включить: если в файле yml.erb или в файле, который анализирует файл yml.erb).

Что у меня есть на данный момент

desktop_icons.rb (внутри config / initializers)

require 'yaml'
require 'rails'
include ActionView::Helpers::AssetTagHelper

module ManageFedertrekOrg
  class Application < Rails::Application
    def desktop_icons
      @icons ||= YAML.load(ERB.new(File.read("#{Rails.root}/config/icons.yml.erb")).result)
    end
  end
end

icons.yml.erb (внутри конфигурации)

 - 
  image: <%= image_path "rails" %>
  title: Test this title

home_controller.rb (внутри контроллеров)

class HomeController < ApplicationController
    skip_filter :authenticate_user!

  def index
    @user_is_signed_in = user_signed_in?
    respond_to do |format|
      format.html { render :layout => false } # index.html.erb
    end
  end

  def icons
    result =
    {
      icons: MyApp::Application.desktop_icons,
      success: true,
      total: MyApp::Application.desktop_icons.count
    }

    respond_to do |format|
      format.json { render json: result }
    end
  end

end

Любое предложение?


person Francesco Belladonna    schedule 11.12.2011    source источник
comment
Я не уверен, достаточно ли инициализирован Rails в том месте, где вы хотите использовать помощники. Посмотрите ответы на этот вопрос, чтобы узнать, как это сделать. Удачи. stackoverflow.com/questions/341143/   -  person ffoeg    schedule 11.12.2011
comment
Я уверен, что рядом с решением, но точно не могу его уловить: \   -  person Francesco Belladonna    schedule 11.12.2011


Ответы (3)


Если ERB нужно анализировать только изнутри представлений, вы можете сделать что-то вроде этого:

Контроллер

@questions = YAML.load_file("#{Rails.root}/config/faq.yml.erb")

Просмотр

<%= ERB.new(@questions[2]["answer"]).result(binding).html_safe %>

Таким образом вы можете контролировать, какие атрибуты действительно анализируются. Кроме того, все помощники, доступные в представлении, доступны в yaml из-за (binding).

person Jordan    schedule 23.07.2012

Rails.application.routes.url_helpers - это модуль с вашими url_helpers, который вы можете указать там, где хотите их использовать. Вы можете передать его в ERB с помощью привязки.

class Application < Rails::Application
  def desktop_icons
    @icons ||= YAML.load(
      ERB.new(File.read("#{Rails.root}/config/icons.yml.erb")).result(binding)
    )
  end
end

а затем в yml

<% extend routes.url_helpers %>
- 
 image: <%= image_path "rails" %>
 title: Test this title

так как во время оценки erb self Rails.application

person clyfe    schedule 11.12.2011
comment
Ваше предложение действительно ценно, но оно не работает (по крайней мере, у меня появляются другие ошибки), я действительно не знаю, как двигаться в этом поле. - person Francesco Belladonna; 11.12.2011
comment
неопределенный метод `image_path 'для #‹ ActionDispatch :: Routing :: RouteSet: 0x4c8c5e8 › - person Francesco Belladonna; 11.12.2011
comment
Я получаю ту же ошибку, я думаю, что самая большая проблема связана с тем, что рельсы недостаточно загружены в инициализаторе (фактически он запрашивает все пути). Как сказал ffoeg, возможно, это проблема. - person Francesco Belladonna; 11.12.2011
comment
Я бы сказал, что это связано с , когда вы вызываете метод desktop_icons, у меня создалось впечатление, что он вызывается после инициализации. - person clyfe; 11.12.2011
comment
Ну, я не знаю, вызывается ли инициализатор до или после инициализации, если он вызывается до того, как это проблема (и если вы добавите его в свой ответ, я могу отметить ваш) - person Francesco Belladonna; 11.12.2011

Похоже, что rails "недостаточно инициализированы", как заявили ffoeg и clyfe. Я переместил скрипт в другую часть моего кода, где рельсы более инициализированы, и теперь он работает хорошо.

person Francesco Belladonna    schedule 12.12.2011