在通过自定义初始化程序编写的config目录中的自定义yml.erb文件中使用image_path帮助程序

时间:2011-12-11 01:46:05

标签: ruby-on-rails ruby-on-rails-3 initializer

我构建了一个yml.erb文件,该文件将用于配置我的应用程序的某些部分。 我想用初始化程序预加载它(我不要求它在应用程序运行期间更改),最大的问题是这个yml文件包含指向app / assets / images目录中的图像的链接。我想在我的yml.erb文件中使用image_path帮助器,但是我遇到了麻烦(我不知道应该包含什么以及我应该在哪里包含它:如果在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

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

如果只需要从内部视图中解析ERB,您可以执行以下操作:

<强>控制器

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

查看

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

通过这种方式,您可以控制实际解析的属性。此外,由于(binding)

,视图中可用的所有帮助程序都在yaml中可用

答案 1 :(得分:1)

Rails.application.routes.url_helpers是一个包含url_helpers的模块,您可以将其包含在要使用它们的位置。您可以通过binding

将此内容传递给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评估时,自我为Rails.application

答案 2 :(得分:0)

看起来像'ffoeg和clyfe所说的那样,导轨“没有初始化”。我将脚本移动到我的代码的另一部分,其中rails更加初始化,现在它运行良好。