开发者

Rails: Is it possible to write view helpers with HAML syntax?

开发者 https://www.devze.com 2023-02-15 22:37 出处:网络
During refactoring it would be quite handy just to copy part of HAML template and paste it to helper\'s code. Currently in such cases 1) I have to rewrite that part of view from scratch 2) I have to u

During refactoring it would be quite handy just to copy part of HAML template and paste it to helper's code. Currently in such cases 1) I have to rewrite that part of view from scratch 2) I have to use that ve开发者_开发百科rbose syntax like content_tag or haml_tag.

I know that it's possible to define partials with HAML systax that will serve as helper. Though 1) as for me it's inconvinient to create a separate file for each small tiny function 2) invocation syntax for partial is quite verbose.

Ideally i'd like my *_helper class to look like this:

- def some_helper(*its_args)
  .some_class
    = some_ruby_expression
  %some_tag#some_id
    - another_expression do
      etc

or at least like this:

define_haml_helper :some_helper, [:arg1, :arg2], %{
  .some_class
    = some_ruby_expression
  %some_tag#some_id
    - another_expression do
      etc
}

Is there a plugin that solves my issue?

Alternatively, maybe you can describe how do you refactor HAML snippets to reusable elements (helpers/functions/partials/builders/etc)?


From the reference:

def render_haml(code)
    engine = Haml::Engine.new(code)
    engine.render
end

This initiates a new Haml engine and renders it.


If all you are after is a method for small reusable snippets, how about partials with local variables? http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials


Haml now has a capture_haml method that you can use to accomplish this.

  def some_helper
    capture_haml do
      .some_class
        = yield
      #some-code-after
    end
  end

some_helper do
  %h1 Hello World
end
=> <div class="some_class">
     <h1>Hello World</h1>
   </div>
   <div id="some-code-after"></div>

Here is a link with more info on capture_haml: http://haml.info/docs/yardoc/Haml/Helpers.html#capture_haml-instance_method


I used heredoc for such purposes:

  def view_helper
    Haml::Engine.new(<<~HAML).render
      .example
        #id ID
        .desc Description
    HAML
  end

This way has a lot of issues with a scope of variables, so, as mentioned above, the much more correct way is to use partials for this.

UPD1: here is a solution on how to solve issues with scope:

  def view_helper
    Haml::Engine.new(<<~HAML).render(self)
      .form
        = form_tag root_path do
          = submit_tag :submit
    HAML
  end

UPD2: even better solution(founded on the internet):

def render_haml(haml, locals = {})
  Haml::Engine.new(haml.strip_heredoc, format: :html5).render(self, locals)
end

def greeting
  render_haml <<-HAML
    .greeting
      Welcome to
      %span.greeting--location
        = Rails.env
  HAML
end
0

精彩评论

暂无评论...
验证码 换一张
取 消