2013-08-05 46 views
2

我想創建一個方法在draper裝飾器,將吐出form_for。我有一個表單用於在索引視圖上搜索記錄並擁有數十個資源,因此如果可能的話(應用程序裝飾器),我真的想在一個地方維護這個邏輯。我的問題是,我不知道如何渲染裝飾器中的form_for。我遇到了concat和capture的一些用法,試圖完成這個,沒有運氣。我所能得到的只是幾個div的顯示(而不是html,就像純文本一樣)。關於如何做到這一點的任何想法?這是代碼我有:德雷珀與form_for方法

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

德雷珀是極好的把邏輯有關的觀點,並在簡單的演示做得很好,但是你原則上應離開內容呈現到視圖,因爲這是它是有什麼。

我推薦的一種模式是在您的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,我真的爲搜索對象創建德雷珀裝飾,並把方法在那裏生成表單而不是「應用」裝飾器。

那麼你的看法是這樣的:

<%= @search.form %> 

如果你需要將@categories的引用,然後將它傳遞到該方法。