Подтвердить что ты не робот

Rails видят помощников в вспомогательном файле

Вероятно, мне не хватает чего-то очевидного, но вот что я пытаюсь сделать.

В представлении я вызываю пользовательскую вспомогательную функцию

<div>
  <%=display_services%>
</div>

В вспомогательном файле с функцией display_services

def display_services
  html = "<div>"
  form_for @user do |f|
   f.text_field ...
  end
 html << "</div>"
end

Я нахожу, что form_for method и f.text_field выводят непосредственно в поток HTML без оболочки div, которая мне нравится. Каков правильный синтаксис для вывода всего HTML в display_services? Заранее благодарим за помощь.

4b9b3361

Ответ 1

Просто предложение для стиля, мне нравится делать что-то вроде этого:

На ваш взгляд:

<% display_services %>

Обратите внимание, что = больше не нужен. Затем хелпер использует concat(), чтобы добавить что-то на свою страницу, а также свойство put-long-strings-together тоже устарело:

def display_services
  concat("<div>")
  form_for @user do |f|
    f.text_field ...
  end
  concat("</div>")
end

Не нужно привязывать тэг <div> к помощнику. Если вам нужен помощник для вложения чего-то в блок, вы также можете использовать магию урожая:

def block_helper
  concat("<div>")
  yield
  concat("</div>")
end

И используйте его, как это, на ваш взгляд, - конечно же, с помощниками:

<% block_helper do %>
  cool block<br/>
  <% display_services %>
<% end %>

Ответ 2

IMHO, вы не должны иметь HTML-код в коде Ruby. Вместо этого предпочитайте частичные представления.

module ServicesHelper
  def display_services(user)
    render :partial => "shared/display_services", :locals => {:user => user}
  end
end

Ответ 3

Как оказалось, мне пришлось сделать что-то вроде этого

def display_services
  html = "<div>"
  html << (form_for @user do |f|
   f.text_field ...
  end)
  html << "</div>"
end

Обратите внимание на(), обернутую вокруг блока формы. Если у кого-то есть лучшее решение, дайте мне знать.