在方法中使用form_for进行draper

时间:2013-08-05 21:14:28

标签: ruby-on-rails ruby decorator capture draper

我正在尝试在draper装饰器中创建一个将吐出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 %>

非常感谢任何帮助!

仅供参考,我已经把它放到了局部并且有效,但是我需要添加一些更复杂的逻辑,这将使它在每个资源的基础上有所不同,所以部分不适合我

由于

1 个答案:

答案 0 :(得分: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,并将该方法放在那里生成表单而不是“application”装饰器。

然后您的观点如下:

<%= @search.form %>

如果您需要对@categories的引用,请将其传递给该方法。