Смешивание Рубина и хамла


Я хотел бы использовать методы Ruby для создания разметки, которая часто появляется на моих страницах. В сущности, я хочу сделать эквивалент этого (ERB-файл):

<% def create_button(text) %>
    <div class="button"><%= text %></div>
<% end %>
...
<% 
    create_button("My First Button")
    create_button("My Second Button")
    # etc.
%>
Очевидно, идея заключается в том, что каждый раз, когда мне нужна кнопка, Я использую create_button.

Решение Ruby/HAML, которое я себе представляю, будет выглядеть примерно так:

def create_button(text)
    %div.button text
end

create_button("My First Button")
create_button("My Second Button")

Выход этого будет таким же, как и у первого блока.

Есть ли способ сделать это? Если нет, то в конечном счете я ищу элегантный способ генерировать разметка с помощью вспомогательных методов Ruby. Если у вас есть какие-либо предложения о том, как это сделать, я хотел бы их услышать. Я новичок в Rails и не очень люблю ERB, но, возможно, я что-то упускаю. В любом случае, я открыт для предложений.

2 3

2 ответа:

Вам никогда не нужно будет определять метод в файле представления в Rails. Это верно независимо от того, является ли язык ERb, Haml или чем-то еще. Вместо этого поместите метод во вспомогательный файл, а затем просто вызовите его в своем представлении:

Приложение / помощники / some_helper.rb

module SomeHelper
  def button(text)
    content_tag :div, text, :class => :button
  end
end

App / views / whatever/view.формат html.haml

= button 'My First Button'
= button 'My Second Button'

Если вам понадобится много сложных помощников, используйте вместо них партиалы и / или исследуйте драгоценный камень клеток.

То, что вы хотите сделать, возможно. Есть некоторая документация со страницы HAML , и вот мое предположение, как вы могли бы использовать ее в вашем situtation:

def my_thing
  haml_engine = Haml::Engine.new(".div_class
     this is my attempt at HAML")
  haml_engine.render
end

Сказав это, я предлагаю вам не делать что-то подобное, а вместо этого использовать Rails (встроенные) помощники или шаблон Presenter (появляющийся в сообществе Rails через мой собственный delegate_presenter или Draper для создания сложных HTML виджетов / элементов