2017-08-08 70 views
0

問題: 渲染QR碼爲用戶在哲基爾模板保留最後QR所有用戶:渲染來自傑奇插件不同的標籤在同一個模板

我有這樣的代碼:

的index.html

{% for person in staff %} 
     {% qr person.qr %} 
    {% endfor %} 

qr.rb

require 'rqrcode_png' 
class QrCodeTag < Liquid::Tag 
    def initialize(tag_name, url, tokens) 
    super 
    @url = url.strip 
    end 

    def lookup(context, name) 
    lookup = context 
    name.split(".").each { |value| lookup = lookup[value] } 
    lookup 
    end 

    def render(context) 
    page_url = "#{lookup(context, 'site.url')}#{lookup(context, @url)}" 
    qr = RQRCode::QRCode.new(page_url, size: 10) # Size increased because URLs can be long 
    png = qr.to_img 
    <<-MARKUP.strip 
    <div class="qrcode"> 
     <img src="#{png.to_data_url}" alt="#{page_url}"> 
    </div> 
    MARKUP 
    end 
end 

Liquid::Template.register_tag('qr', QrCodeTag) 

2017-09-01-john-doe.md

--- 
category: staff 
name: John Doe 
qr: "http://www.johndoe.com/" 
--- 

John is really cool... 

2017-09-02-maria-doe.md

--- 
category: staff 
name: John Doe 
qr: "http://www.mariadoe.com/" 
--- 

Maria is really cool.. 

現在,呈現頁面時,它呈現 頁成功,但保持相同的對象(QR碼) 爲所有用戶在同一頁面上呈現(它們必須位於同一頁面上)。

我很確定問題在於,在創建新的對象或與未正確分配的全局變量相關的東西時,我並未刪除舊對象。

在這種情況下,每個用戶應該有不同的QR碼,但他們都一樣。

解決方法:

如果您在摘錄添加標籤,你將有渲染精細的QR碼標籤。

現在有沒有人可以解釋爲什麼如果你像下面的例子那樣在摘錄中添加數據,它會爲每個用戶渲染一個不同的QR碼,但是如果在前面的內容中將它作爲變量添加將是相同的對於所有人(最後一個人會重複)?

--- 
category: staff 
name: John Doe 
qr: "http://www.johndoe.com/" 
--- 

{% qr http://www.johndoe.com %} 
John is really cool... 
+0

最後一個例子真的有用嗎?或者在渲染時出現錯誤? ('{%qr http://www.johndoe.com%}') –

+0

它呈現完美,事情是我只爲所有用戶獲取最新的QR。 – ccamacho

+0

它不會像這樣工作,'page_url =「#{lookup(context,'site.url')}#{lookup(context,@url)}」'會嘗試查找上下文中發送的字符串,所以它會在上下文中尋找「person.qr」,所以發送一個url,應該給出這樣的錯誤:'nil:NilClass'的undefined method'[]'。它是否生成了一個對於http:// www.johndoe.com /'url正確的qr代碼? –

回答

0

這是實際的解決辦法:

require 'rqrcode_png' 
class QrCodeTag < Liquid::Tag 
    include Jekyll::LiquidExtensions 
    def initialize(tag_name, url, tokens) 
    super 
    params = Shellwords.shellwords url 
    @url = url.strip 
    end 

    def render(context) 
    page_url = Liquid::Template.parse('{{'[email protected]+'}}').render context 

    qr = RQRCode::QRCode.new(page_url, size: 4) # Size increased because URLs can be long 
    png = qr.to_img 
    png = png.resize(120, 120) 
    <<-MARKUP.strip 
    <div class="qrcode"> 
     <a href="#{page_url}" target="_blank"> <img src="#{png.to_data_url}" alt="#{page_url}"> </a> 
    </div> 
    MARKUP 
    end 
end 

Liquid::Template.register_tag('qr', QrCodeTag) 

所以,我們分析該字符串,並得到該變量的實際價值。

0

{% qr person.qr %}經過所述string "person.qr",而不是相應的值。你可以做{% qr {{p.qr}} %}

相關問題