我有一个Rails应用程序,我在其中呈现存储在模型属性中的一块Haml内容。在Haml的那个块中使用Rails视图助手会很不错。目前,我在视图助手中使用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
有关如何做到这一点的任何想法?
更好的想法?
答案 0 :(得分:14)
render方法允许您指定上下文。像
这样的东西base = Class.new do
include ActionView::Helpers::AssetTagHelper
include ApplicationHelper
end.new
Haml::Engine.new(src).render(base)
可行。
答案 1 :(得分:3)
马塞尔朝着正确的方向前进。但是你需要从某个地方获得渲染引擎的有效范围。我所做的是用这样的有效范围调用助手:
在my_view / edit.html.haml
中=my_revertable_field(self, 'hello world')
在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全部工作
答案 2 :(得分:0)
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
它对我有用。基于this问题。