【问题标题】:Using rails methods with Haml::Engine使用带有 Haml::Engine 的 rails 方法
【发布时间】:2011-09-26 22:30:11
【问题描述】:

我想要一个读取 HAML 文件并从中创建静态 html 文件的 rake 任务。这样做的原因是我想以这里http://devcorner.mynewsdesk.com/2010/01/13/rails-i18n-and-404500-error-pages/

描述的方式动态本地化我的错误页面

这是错误页面的编写方法。

def write_error_page(status, locale = nil)
  dest_filename = [status.to_s, locale, "html"].compact.join(".")
  File.open(File.join(Rails.root, "public", dest_filename), "w") do |file|
    path = File.join(Rails.root, "app", "views", "errors", "#{status}.haml")
    file.print Haml::Engine.new(File.read(path)).render
  end   
end

问题在于 Haml::Engine 没有可用的 rails 方法。因此,当尝试读取 haml 文件时,文件中的每个 rails 方法都会出现错误(我想使用方法 比如 image_tag、form_for 和显然是 I18n.translate)。

我注意到这里已经解决了一个类似的问题:Rails HAML engine rendering

但是,当我尝试上面链接中提到的解决方案时,我收到以下错误:“undefined local variable or method `config' for #”。

如何让 Rails 方法在 Haml::Engine 中工作,以便读取 HAML 文件?我也尝试切换到 ERB,但注意到它会导致同样的问题,其他人在这里至少部分解决了 render erb from database into view problem please help! 但这个解决方案也没有帮助我。

除了使用 Haml::Engine 之外,我还愿意接受其他解决方案。我查看了 capture_haml 助手,但也不知道这对我有什么帮助。

【问题讨论】:

    标签: ruby-on-rails ruby internationalization rake haml


    【解决方案1】:

    您需要使 :environment 成为您的 rake 任务的依赖项:

    task :some_task => :environment do
      # stuff here
    end
    

    这将加载 Rails。好像还没加载。

    【讨论】:

    • 不,不是这样。我从这个 rake 任务中调用 write_error_pages 方法: task :write_error_pages => :environment do ... end 我在 write_error_page 方法中使用了 rails 方法,但不在 Haml::Engine 内部,因为 Haml::Engine 是一种使用 Haml 而不依赖于 rails。所以从这个意义上说,这听起来像是一条错误的路,但我想不出任何其他方法来做到这一点。
    【解决方案2】:

    我刚刚意识到在这种情况下我不需要 Haml::Engine,因为我在 rails 环境中,所以我可以调用 render.傻我。

    但是,从 rake 任务中调用 render 并不是一件容易的事,因为我们不在控制器或视图中(我认为,rails 纯粹主义者甚至说你不应该这样做,但在这种情况下似乎喜欢最简单的方法),所以我发布了我在这里使用的代码(我使用了这里提到的方法:http://wholemeal.co.nz/blog/2011/04/05/rendering-from-a-model-in-rails-3/)。

    def write_error_page(status, locale = nil)
      dest_filename = [status.to_s, locale, "html"].compact.join(".")
      File.open(File.join(Rails.root, "public", dest_filename), "w") do |file|
        path = File.join("app", "views", "errors", "#{status}.haml")
        file.print ActionView::Base.new(Rails.configuration.paths.app.views.first).render(:file => path)
      end   
    end
    

    我对这种方法也有一些问题。例如,form_for 仍然不能正常工作(我想在错误页面上有一个反馈表),所以我只是用纯 HTML 创建了表单(幸运的是,您可以直接将其注入 .haml 文件)。但是我需要在 .haml 模板中工作的 Rails 中的一件事 - 方法 I18n.translate - 就像魅力一样。

    【讨论】:

    • 我正在尝试使用它,但 Rails.configuration.paths.app.views.first 它为#<:paths::root:0x000000032ed968> 给出了一个错误未定义的方法“app”。 ..你能帮忙吗?
    • 解决了我改用:Rails.configuration.paths["app/views"].first
    • 现在其他问题,我无法访问辅助方法,我该如何注入?
    • Resolved =) 在调用 ActionView::Base.new 之前刚刚做了:包括 ActionView::Helpers::ApplicationHelper
    【解决方案3】:

    我根据你的解决方案做了这个解决方案,一旦你的解决方案不适合我,因为视图路径,并且因为我需要从我的应用程序助手中包含一些功能。我认为您可以解决 form_for 问题,包括:ActionView::Base.send :include, ActionView::Helpers::FormHelper

    我将格式更改为 html,因为这是我需要的...

    def to_html
      ActionView::Base.send :include, ActionView::Helpers::ApplicationHelper
    
      File.open(File.join(Rails.root, "public", 'test.html'), "w") do |file|
    
      file.print ActionView::Base.new(Rails.configuration.paths["app/views"].first).render(
                    :partial => 'partial_folder/partial', 
                    :format => :html,
                    :locals => { :model => self}
                  )
      end  
    end
    

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 2023-03-18
      • 2012-10-15
      • 2013-10-14
      • 2016-05-02
      • 1970-01-01
      相关资源
      最近更新 更多