Использование Rails для просмотра помощников с Haml :: Engine - PullRequest
7 голосов
/ 02 марта 2011

У меня есть приложение Rails, в котором я отрисовываю блок содержимого Haml, хранящийся в атрибуте модели.Было бы неплохо использовать помощники вида Rails в этом блоке Haml.В настоящее время я использую Haml :: Engine # render в помощнике вида для визуализации содержимого этого атрибута модели.Это работает достаточно хорошо, но я не могу использовать такие вещи, как = link_to.Чтобы проиллюстрировать проблему:

irb(main):003:0> haml_text=<<"EOH"
irb(main):004:0" %p
irb(main):005:0"   =image_tag 'someimage'
irb(main):006:0" EOH
=> "%p\n  =image_tag 'someimage'\n"
irb(main):007:0> engine = Haml::Engine.new(haml_text)
=> #<Haml::Engine:0x7fa9ff7f1150 ... >
irb(main):008:0> engine.render
NoMethodError: undefined method `image_tag' for #<Object:0x7fa9ff7e9a40>
        from (haml):2:in `render'
        from /usr/lib/ruby/gems/1.8/gems/haml-3.0.25/lib/haml/engine.rb:178:in `render'
        from /usr/lib/ruby/gems/1.8/gems/haml-3.0.25/lib/haml/engine.rb:178:in `instance_eval'
        from /usr/lib/ruby/gems/1.8/gems/haml-3.0.25/lib/haml/engine.rb:178:in `render'
        from (irb):8

Есть мысли о том, как это сделать?

Лучшие идеи?

Ответы [ 3 ]

14 голосов
/ 02 марта 2011

Метод рендеринга позволяет вам указать контекст.Может работать что-то вроде

base = Class.new do
  include ActionView::Helpers::AssetTagHelper
  include ApplicationHelper
end.new

Haml::Engine.new(src).render(base)

.

3 голосов
/ 18 сентября 2013

Марсель шел в правильном направлении. Но вам нужно где-то получить действительную область видимости для механизма рендеринга. Что я сделал, так это вызвал помощника с действительной областью действия, подобной этой:

В my_view / edit.html.haml

=my_revertable_field(self, 'hello world')

In application_helper.rb

def my_revertable_field(haml_scope, title, field)
      template =<<EOS
.field
  #{label}
  = text_field_tag #{field.name}, #{field.amount}, :size=>5, :class=>"text"
  = image_tag("refreshArrow.gif",:class=>"revert-icon", :style=>"display:none;",:title=>"Revert to default, #{field.default}")
EOS
end

Тогда у вас есть действительная область действия haml, поэтому image_tab, form_tag_helpers all work

0 голосов
/ 04 июня 2017
class RailsRenderingContext
  def self.create(controller)
    view_context = ApplicationController.helpers
    class << view_context; include Rails.application.routes.url_helpers; end

    view_context.request = controller.request
    view_context.view_paths = controller.view_paths
    view_context.controller = controller

    view_context
  end
end

class MyController < ApplicationController
  def show
    # ...
    engine = Haml::Engine.new haml
    ctx = RailsRenderingContext.create(self)
    engine.render ctx 
  end
end

Это работает для меня.На основании этой проблемы.

...