2011-10-27 20 views
15

के अंदर तरल वेरिएबल का उपयोग करके मैं तरल में एक कस्टम लिंक टैग बना दिया है और मैं बहुतएक तरल टैग कॉल

{{ assign id = 'something' }} // this value is actual dynamic while looping through data 
{% link_to article: id, text: 'Click Me!' %} // my custom tag 

हालांकि इस में जो परिणाम की तरह है कि टैग के लिए कॉल में तरल चर पारित करने के लिए सक्षम होने के लिए कोशिश कर रहा हूँ लेख पैरामीटर को इसके ऊपर दिए गए असाइनमेंट कथन के अनुसार 'कुछ' के बजाय 'आईडी' के रूप में पारित किया जा रहा है।

क्या कोई जानता है टैग टैग में चर को कैसे पास किया जाए?

उत्तर

2

इस तरह प्रतीत नहीं होता है मेरे समाधान सिर्फ टैग करने के लिए चर नाम गुजरती हैं और यह संदर्भ टैग में गाया जा रहा है से बाहर खींचने के लिए था संभव है, जैसा तो:।

{% for article in category.articles %} 
    {% link_to variable: article, text: title %} 
{% endfor %} 

मेरी टैग कोड (गाढ़ा) में:

def render(context) 
    uri = "article/#{context[@options[:variable]]['id']}" 
    "<a href='#{uri}'>#{build_link_text context}</a>" 
end 
+0

आप यह कैसे परीक्षण करते हैं? – mhenrixon

5

मैं हाल ही में टैग पैरामीटर के रूप में चर के नाम पास करके बहुत बस Jekyll 0.11.2 और तरल 2.3.0 के साथ इस समाधान कर लिया है।

{% assign v = 'art' %} 
{% link_to_article v %} 

तुम भी, जबकि एक पाश में, जैसे ऊपर article नियंत्रण वर का नाम दे सकते हैं।

Liquid::Tag.initialize में, @markup दूसरा पैरामीटर है, टैग नाम के बाद स्ट्रिंग है। असाइन किए गए चर context के शीर्ष स्तर पर उपलब्ध हैं।

def render(context) 
    "/#{context[@markup.strip]}/" 
end 

यह स्पष्ट रूप से केवल एक परम पारित करने की अनुमति देता है। एक और जटिल समाधान x: 2, y: 3 जैसे पैरा पार्स करेगा।

3

इसने मेरे लिए context[@markup.strip] केस हल किया। {% get_menu main_menu navigation.html settings.theme.id %}

ऐसा करने में मैं पहले हर जगह चरित्र पर विभिन्न varaibles में चर स्ट्रिंग विभाजित:

मेरे समस्या यह है कि मैं इस तरह अपने कस्टम तरल टैग के लिए एक चर पारित करने के लिए सक्षम होने के लिए चाहते थे।

class GetMenu < Liquid::Tag 
    include ApplicationHelper 
    def initialize(tag_name, variables, tokens) 

     @variables = variables.split(" ") 

     @menu_object = @variables[0] 
     @file_name = @variables[1] 
     @theme_id = @variables[2] 

     super 
    end 

    def render(context) 

     # This is where i use context[@theme_id.strip] to get the variable of "settings.theme.id" 
     content = CodeFile.find_by(hierarchy: 'snippet', name: @file_name.to_s, theme_id: context[@theme_id.strip]) 

     @menu ||= Menu.find_by_slug(@menu_object) 

     context.merge('menu' => @menu) 

     Liquid::Template.parse(content.code).render(context) 

    end 

end 

Liquid::Template.register_tag('get_menu', GetMenu) 

* यह सिर्फ एक अधिक समृद्ध उदाहरण है कि इस सवाल का जवाब ऊपर जोनाथन जूलियन

0

द्वारा यह एक टैग है कि

{% assign v = 'art' %} 
{% link_to_article v %} 

तरह शाब्दिक और चर के साथ कहा जा सकता है के लिए बहुत अच्छा होगा है या

{% link_to_article 'art' %} 

या

{% link_to_article "art" %} 

और यह भी निश्चित रूप से

{% link_to_article include.article %} 

आदेश में तो मैं एक सहायक समारोह का प्रस्ताव करने के

def get_value(context, expression) 
    if (expression[0]=='"' and expression[-1]=='"') or (expression[0]=="'" and expression[-1]=="'") 
    # it is a literal 
    return expression[1..-2] 
    else 
    # it is a variable 
    lookup_path = expression.split('.') 
    result = context 
    puts lookup_path 
    lookup_path.each do |variable| 
     result = result[variable] if result 
    end 
    return result 
    end 
end 

और में प्रस्तुत करना सिर्फ शाब्दिक या चर का मान प्राप्त करने के लिए सहायक फ़ंक्शन को कॉल करें ।

def render(context) 
    v = get_value(context, @markup.strip) 
end 

FYI करें, initialiser इस प्रकार दिखाई देगा:

def initialize(tag_name, markup, tokens) 
    @markup = markup 
    super 
end 
संबंधित मुद्दे