我正在尝试在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 %>
非常感谢任何帮助!
仅供参考,我已经把它放到了局部并且有效,但是我需要添加一些更复杂的逻辑,这将使它在每个资源的基础上有所不同,所以部分不适合我
由于
答案 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
的引用,请将其传递给该方法。