Дрейпер с form_for в методе

Я пытаюсь создать метод в декораторе драпировки, который будет выдавать form_for. У меня есть форма, которую я использую для поиска записей в представлении индекса, и у меня есть десятки ресурсов, поэтому я действительно хочу сохранить эту логику в одном месте, если это возможно (декоратор приложений). Моя проблема в том, что я понятия не имею, как сделать form_for в декораторе. Я столкнулся с некоторыми вариантами использования concat и capture, чтобы попытаться выполнить это, но безуспешно. Все, что я смог получить, это пара моих div для отображения (не как html, а как обычный текст). Любые идеи о том, как я могу это сделать? Это код, который у меня есть:

def crud_index_search(search_obj)

h.concat "<div id='basic_search' style='display:none;'>"

search_form_for search_obj do |f|
  h.concat '<div class="input-append">'
  f.text_field :name_or_description_cont, :placeholder => 'Quick search ...', :id => 'search'
  h.concat "<button class='btn'><i class='icon-search'></i></button>"
  h.concat '</div>'
  link_to 'Advanced Search', '#', :id => 'advanced_search_btn', :class => 'pull-right'
end

h.concat '</div>'

h.concat "<div id='advanced_search' style='display:none;'>"
search_form_for search_obj do |f|
  f.condition_fields do |c|
    h.concat render "crud/partials/condition_fields", :f => c
  end
  h.concat "<p>#{ link_to_add_fields 'Add Conditions', f, :condition }</p>"
  f.submit 'Search'
  h.concat "#{link_to 'Basic Search', '#', :id => 'basic_search_btn', :class => 'pull-right'}"
end
h.concat '</div>'
end

а на мой взгляд...

<%= @categories.crud_index_search @search %>

Любая помощь будет принята с благодарностью!

К вашему сведению, я уже поместил это в партиал, и это работает, однако мне нужно будет добавить к этому более сложную логику, которая будет различаться для каждого ресурса, поэтому парциал не идеален для меня.

Спасибо


person Sean    schedule 05.08.2013    source источник


Ответы (1)


Draper отлично подходит для размещения логики, относящейся к представлению, и хорошо справляется с простым представлением, однако в принципе вы должны оставить представление содержимого представлению, поскольку именно для этого оно и существует.

Шаблон, который я рекомендую, заключается в использовании метода в вашем объекте Draper для упрощения логики и для каждого логического пути рендеринга соответствующего фрагмента.

Итак, у вас может быть что-то вроде этого:

def crud_search_index(search_object)
  if search_object.something_to_check
    h.render 'shared/one_version_of_my_form'
  else
    h.render 'shared/another_version_of_my_form'
  end
end

И, что еще лучше, поскольку ваша форма напрямую связана с этим search_object, я бы фактически создал Draper Decorator для этого объекта поиска и поместил туда метод для создания формы вместо декоратора «приложения».

Тогда ваш взгляд выглядит примерно так:

<%= @search.form %>

И если вам нужна ссылка на @categories, передайте ее этому методу.

person Alex Peachey    schedule 05.08.2013