2015-02-23 105 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