2015-02-23 108 views
0

我在寫一個簡單的頁面,它可以幫助我查看與Flickr帳戶相比我的網站自定義畫廊的同步狀態。Rails助手使用

我有一個簡單的循環,在從Flickr的API的響應迭代:

<% for collection in @flickr_hierarchy %> 
    <%= traverse_collection(collection, 0) %> 
<% end %> 

traverse_collection是Rails輔助方法,像這樣:

module GalleryHelper 

    def traverse_collection(collection, parent) 
    parent = parent == 0 ? 0 : parent["id"] 

    content_tag(:tr) do 
     content_tag(:td, 'Collection') 

     collectionLocal = Collection.where(flickr_id: collection.id).first 

     if collectionLocal != nil 
     content_tag(:td, 'Yes') 
     else 
     content_tag(:td, 'No') 
     end 
     content_tag(:td, '&nbsp;') 
     content_tag(:td, '&nbsp;') 
     content_tag(:td, collection.title) 
     content_tag(:td, collection.id) 
     content_tag(:td, parent.to_s) 
     content_tag(:td, 'N/A') 
     content_tag(:td) do 
     if collectionLocal != nil 
      button_to('Add all Sets', admin_add_all_sets_for_collection_path(flickr_collection_id: collection.id)) 
      button_to('Delete Collection', admin_delete_collection_path(flickr_collection_id: collection.id)) 
     else 
      button_to('Add Collection', admin_add_collection_path(flickr_collection_id: collection.id, flickr_parent_collection_id: parent.to_s)) 
      button_to('Add Collection and Sets', admin_add_all_sets_for_collection_path(flickr_collection_id: collection.id, flickr_parent_collection_id: parent.to_s)) 
     end 
     end 
    end 
    end 

end 

不幸的是我已經發現有是不是很好或非雜亂的代碼方式來獲得生成的HTML輸出在我的網頁上。

有沒有一個很好的方法來做到這一點,或者我應該採取不同的方法。有任何想法嗎?

感謝, 尼爾

+0

你能解釋一下這個問題嗎?你是否試圖將HTML邏輯從幫手中拿出來? – kendotwill 2015-03-02 17:12:43

+0

@kendotwill當我從我的視圖運行該輔助方法時,我無法獲得生成的HTML輸出。 – rctneil 2015-03-02 17:15:39

+0

您是否試圖在頁面已經加載後生成HTML? – kendotwill 2015-03-02 17:33:29

回答

1

你應該移動HTML的裝配出你的助手,併成爲一個部分。創建一個文件app/views/gallery/_row.html.erb(你可以命名爲任何你想要的,但要確保文件開始用下劃線),並把你的HTML那裏,就像這樣:

<tr> 
    <td>Collection</td> 
    <td><%= collection_local.present? ? "Yes" : "No" %></td> 
    <td>&nbsp;</td> 
    <td>&nbsp;</td> 
    <td><%= collection.title %></td> 
    <td><%= collection.id %></td> 
    <td><%= parent %></td> 
    <td>N/A</td> 
    <td> 
    <% if collection_local.present? %> 
     <%= button_to(
      "Add all Sets", 
      admin_add_all_sets_for_collection_path(flickr_collection_id: collection.id) 
      ) %> 
     <%= button_to(
      "Delete Collection", 
      admin_delete_collection_path(flickr_collection_id: collection.id) 
      ) %> 
    <% else %> 
     <%= button_to(
      "Add Collection", 
      admin_add_collection_path(
       flickr_collection_id: collection.id, 
       flickr_parent_collection_id: parent.to_s 
      )) %> 
     <%= button_to(
      "Add Collection and Sets", 
      admin_add_all_sets_for_collection_path(
       flickr_collection_id: collection.id, 
       flickr_parent_collection_id: parent.to_s 
      )) %> 
    <% end %> 
    </td> 
</tr> 

現在所有的幫手需要做的就是調用render與部分名稱和部分需要的「本地」(變量)。在這種情況下,名稱爲gallery/row(文件名不帶下劃線和擴展名),部分需要的變量爲:collection,collection_localparent。因此,渲染調用看起來像這樣:

module GalleryHelper 

    def traverse_collection(collection, parent) 
    parent = parent == 0 ? 0 : parent["id"] 
    collection_local = Collection.where(flickr_id: collection.id).first 

    render(
     partial: "gallery/row", 
     locals: { 
     collection: collection, 
     collection_local: collection_local, 
     parent: parent 
     }) 
    end 
end 

這有幫助嗎?

有關如何在官方Ruby on Rails Guides中使用偏分量的更多信息。

+0

這很有道理!當我獲得時間時,我希望今晚能有這樣的希望。謝謝。我將會報告我如何繼續。 – rctneil 2015-03-03 08:28:53

+0

這是完美的。感謝您幫助我瞭解我應該將問題分離出來,並讓代碼更加靈活和整齊! – rctneil 2015-03-03 21:11:46

1

你可以在你的helper方法使用render

請參閱How to render a view/partial in a helper w/o the layout?

只需用商業/演示邏輯繞模板的helper方法,準備好您的範圍,讓渲染引擎做渲染。

這有幫助嗎?

UPDATE

可以撥打您的輔助方法,包括render幾乎一切,這將指示Rails的引擎渲染任何視圖/分進請求響應

這是助手實現

# app/helpers/application_helper.rb 
module ApplicationHelper 
    def hello() 
    # Prepare your model into locals, which will be passed to your partial 
    # template 
    render partial: 'shared/hello', locals: {text: 'world'} 
    end 
end 

這是輔助方法中使用的部分模板

<!-- views/shared/_hello.html.erb --> 
<div>hello <%= text %></div> 

這是精心策劃的要求

<!-- views/welcome/index.html.erb --> 
<h1>Test</h1> 
<%= hello %> 
+0

感謝您的回答,但我很困惑如何使用它來讓它工作?你能否在我原來的問題中進一步擴展? – rctneil 2015-03-02 16:46:03

+0

請參閱我的更新。這應該澄清你的問題 – 2015-03-04 08:54:17

0

你必須在每個content_tag的末尾添加一個加號+,也許是button_to主控制器視圖。否則,只有最後一個content_tag會被創建。

module GalleryHelper 

    def traverse_collection(collection, parent) 
    parent = parent == 0 ? 0 : parent["id"] 

    collectionLocal = Collection.where(flickr_id: collection.id).first 

    content_tag(:tr) do 
     content_tag(:td, 'Collection') + 

     content_tag(:td, (collectionLocal != nil) ? 'Yes' : 'No') + 
     content_tag(:td, '&nbsp;') + 
     content_tag(:td, '&nbsp;') + 
     content_tag(:td, collection.title) + 
     content_tag(:td, collection.id) + 
     content_tag(:td, parent.to_s) + 
     content_tag(:td, 'N/A') + 
     content_tag(:td) do 
     if collectionLocal != nil 
      button_to('Add all Sets', admin_add_all_sets_for_collection_path(flickr_collection_id: collection.id)) + 
      button_to('Delete Collection', admin_delete_collection_path(flickr_collection_id: collection.id)) 
     else 
      button_to('Add Collection', admin_add_collection_path(flickr_collection_id: collection.id, flickr_parent_collection_id: parent.to_s)) + 
      button_to('Add Collection and Sets', admin_add_all_sets_for_collection_path(flickr_collection_id: collection.id, flickr_parent_collection_id: parent.to_s)) 
     end 
     end 
    end 
    end 
end 

Rails- nested content_tag

+0

這並沒有什麼區別。 – rctneil 2015-03-02 21:09:19

+0

@ rctneil我測試了它,假設'@ flickr_hierarchy'不是零。如果您在加載頁面之後在瀏覽器中查看源代碼,並且沒有看到空的tr'',那麼您的功能根本沒有被調用。如果正在執行'for',我將開始調試。如果你想修復你當前的代碼,你需要在'content_tags'末尾加一個'+'。 – kendotwill 2015-03-03 06:13:25