2014-09-05 84 views
16

TL; DR: Microdata強制您使用itemprop作爲此itemprops值的itemtype。如果你想把你的模板分解成部分,你如何處理這個問題?該元素可能只出現在兩個地方之一中,無論是在包含模板中還是在包含的部分中,這兩者都不能很好地工作。Microdata:如何使用模板/部分?

我正在使用haml的Rails,但我想我的問題適用於任何模板引擎,您可以將模板分割成更小的部分。我大量使用partials,這意味着我的模板通常不會超過10行代碼。但將微數據擬合到這些看起來過於複雜,那麼你應該如何恰當地使用微數據和偏微分?

拿這個例子:

#app/views/article/show.html.haml 
%p Hey, Welcome! Read This wonderful article: 
= render @article 

#app/views/articles/_article.html.haml 
%div[ article ] 
    %h1= @article.title 
    %p= @article.description 
    %div= render @article.video 

#app/views/videos/_video.html.haml 
%div[ video ] 
    %h2= video.file_name 
    %video{ src: video.url } 

現在用微:

#app/views/articles/_article.html.haml 
%div[ article ]{ itemscope: true, itemtype: 'http://schema.org/Article' } 
    %h1{ itemprop: 'name' }= @article.title 
    %p{ itemprop: 'description' }= @article.description 
    %div{ itemprop: 'video' }= render @article.video 

然後呢?我必須在同一個div上添加VideoObject itemtype,它具有itemprop: 'video',因爲這就是微數據的工作原理。所以:

#app/views/articles/_article.html.haml 
%div{ itemprop: 'video', itemscope: true, itemtype: 'http://schema.org/VideoObject' }= render @article.video 

但是,然後我不能在視頻部分再次使用相同的itemtype。這現在將無效:

#app/views/videos/_video.html.haml 
%div[ video, itemscope: true, itemtype: 'http://schema.org/VideoObject' ] 

但是itemtype屬於視頻。我不想在每一個容器元素中重複它。我希望能夠在其他地方使用部分視頻,並且仍然會將其視爲具有微數據的視頻。所以,整個事情已經搬出物品的部分,進入VIDO部分是這樣的:

#app/views/articles/_article.html.haml 
%div= render @article.video 

#app/views/videos/_video.html.haml 
%div[ video ]{ itemprop: 'video', itemscope: true, itemtype: 'http://schema.org/VideoObject' } 

同樣,itemprop必須爲視頻項目類型相同的元素。但爲什麼視頻部分關心/知道itemprop是如何被調用的,這是它的價值?

我唯一的解決方案是將itemprop傳遞給partial。這也意味着,如果沒有傳遞,我們必須聲明一個默認的itemprop。所以我們結束了這個:

#app/views/articles/_article.html.haml 
%div= render @article.video, itemprop: 'video' 

#app/views/videos/_video.html.haml 
itemprop ||= nil 
%div[ video ]{ itemprop: itemprop, itemscope: true, itemtype: 'http://schema.org/VideoObject' } 

這似乎過於複雜。另外我發現將itemprop的名稱傳遞到partial中會讓人感到困惑,因此partial會知道itemprop被調用的是它的值。這有多奇怪?在編程的其他地方,我遇到了需要知道指向它們的事物名稱的對象。

那麼有沒有更好的方法來做到這一點?或者,這是怎麼回事,我不應該這麼嘮叨呢? ☺

+3

支持這樣一個雄辯的問題! – 2014-09-05 09:32:07

+0

@RichPeck是的,在完成後我想,這應該是一個博客文章,而不是。但是再一次,我沒有博客,所以,呃。 ;) – Conkerchen 2014-09-05 09:36:49

+2

唯一的問題是像我這樣的人想看到一個簡短的問題來回答:D需要大量的腦力來制定答案,而不必解決原始問題。你可以加一個旁邊給我們一個更簡潔的問題嗎? – 2014-09-05 09:39:55

回答

0

我認爲你對將div-business放入局部區域猶豫不決,因爲它在語義上並不屬於那裏,如果你想在沒有div的情況下將視頻渲染到其他地方,那麼你遇到了麻煩。

所以這是我建議:

  1. 你可以看看包裹的視頻對象(我想這是某種模式)轉換成裝飾和渲染在div企業那裏。

  2. 你甚至可以使一個普通的微觀數據-DIV-部分,這可能去約,如:

%div [ your-item-type ] { itemprop: propvar, itemscope: true, itemtype: typevar } render item

這可能是語法太可怕了,很抱歉。

  1. 然後,您可以渲染出裝飾器方法中的div,並獨立於您的視頻在其自身部分中的渲染方式。

所以其基本上是: [控制器]

@video.decorate 

- > [查看]:

@video.render_with_micro 

- > [裝飾]:使微數據-DIV-局部用@視頻作爲項目和給定的itemprops,itemtypes - > Itemprops,Itemtypes正在裝飾器內維護(這是他們所屬的地方國際海事組織,他們是代表信息)。

我希望我的考題幫助, 乾杯!

2

不得不閱讀它幾次才能得到問題的要點。這是一個很好的問題!

TL; DR:是的,你有點婊子,但是很好!使用裝飾器或單元格可以讓感覺更好,但不幸的是總會需要一種方式讓兩個範圍相互作用,而父範圍則影響嵌入範圍。看看你的問題,它似乎主要是基於一個在其他編程領域也很常見的問題,它在計算中引起了很多討論和不滿(例如參見JavaScript範圍)。我正在談論物體的範圍。在這種情況下,我們正在討論兩個元素的範圍,當嵌入到父元素中時,必須有不同的行爲。

在您的問題的實際水平上;你是對的,部分應該有責任爲對象提供itemscope和itemtype。這從對象的角度來看對我來說最爲合理,並且與文章的頂層元素保持一致。我會以這種方式來看待它。在這種情況下,這是最一致的。

對於在嵌入時在元素中提供itemprop的解決方案;如果從渲染的地方傳遞它似乎是最符合邏輯的,那麼你就是解決方案。我同意這不看「紅寶石的方式」,所以我建議的確看看decoratorscells。這兩個都可以幫助你清理你的觀點/偏見。看起來你已經進入了部分方法,單元可以爲視圖內的控制器提供一個額外的層。有時非常有用。

我喜歡@jfornoff的建議,即創建更通用的解決方案,您還可以將其用於除視頻之外的項目。還有solutions out there for microformats。微格式助手和Html模式似乎都試圖幫助你這樣做,儘管兩者都需要一些新的貢獻。

相關問題