2012-10-09 70 views
0

我已經嘗試過Facebook的Open Graph協議,在Rails頁面上添加元數據。我現在想要做的是讓我的代碼不重複或DRY ---而不是爲每個控制器頁面放置一個元數據頭,我想創建一個名爲「MyMetaBuilder」的基類,它將被繼承通過子頁面,但不知道在哪裏以及如何開始編碼... 有人建議元數據屬性值必須根據上下文動態生成。例如,PlayMetaBuilder,CookMetaBuilder等...添加Facebook元數據到子頁面的Rails頁面

此外,當單元測試控制器動作時,如何驗證其存在性?

非常感謝。

回答

0

有一件事是定義標籤,另一件是呈現它們。我會做到以下幾點:

  • 寫控制器混入(類似acts_as_metatagable),在那裏我會定義特定的領域爲每個控制器(和填充默認剩餘)。這些將被分配給一個類(或實例)變量,並以這種方式在渲染步驟中可訪問)。

  • 編寫一個幫助函數,該函數將採用我所有的標記並將它們轉換爲html。這個輔助函數然後會在佈局中被調用並被渲染到文檔的頭部。

所以,它看起來有點像這樣: #homepage_controller.rb 類HomepageController <的ActionController :: Base的 #選項1.2:包括直接在這裏與下面 #線包括ActsAsMetatagable acts_as_metatagable:標題=> 「標題」,:URL => homepage_url 結束

# lib/acts_as_metatagable.rb 
module ActsAsMetatagable 
    module MetatagableMethods 
    #option 2.2: insert og_tags method here and declare it as helper method 
    def og_metatags 
     @og_tags.map do |k, v| 
     # render meta tags here according to its spec 
     end 
    end 
    def self.included(base) 
     base.helper_method :og_tags 
    end 
    end 

    def acts_as_metagabable(*args) 
    include MetatagableMethods 
    # insert dirty work here 
    end 
end 

# option 1.1: include it in an initializer 
# initializers/acts_as_metatagable.rb 
ActiveController::Base.send :include, ActsAsMetatagable 


# option 2.1: insert og_metatags helper method in an helper 
module ApplicationHelper 
    def og_metatags 
    @og_tags.map do |k, v| 
     # render meta tags here according to its spec 
    end 
    end 
end 
+0

感謝@ChuckE。我可以知道在什麼目錄或文件中可以放置上述示例嗎?它只在單個文件中嗎? 我是一個總新手與此.. 我之前做了什麼是每個show.html.erb文件中的每個元標記內# ... – jezureru

+0

我通常將mixins放在lib中,並將它們包括無論是直接上課還是初始化。輔助方法是有爭議的。將其直接放置在助手中,或者通過在控制器mixin中定義它並將其保存爲輔助方法,並將其聲明爲輔助方法:http://apidock.com/rails/ActionController/Helpers/ClassMethods/helper_method。我將編輯我的示例。 – ChuckE

0

我做什麼Scoutzie,是把所有的元數據爲部分一個頭,用的if/else案件這樣:

%meta{:type => 'Author', :content => "Kirill Zubovsky"} 
%meta{'property' => "og:site_name", :content=>"Scoutzie"} 
-if @designer 
... 
-elsif @design 
... 
-else 
... 

這樣,根據加載的變量,我知道它是哪個頁面,從而知道要包含哪些元數據。這可能不是一個優雅的解決方案,但它很有效,而且非常簡單。