2011-10-27 26 views
15

tôi đã thực hiện một thẻ liên kết tùy chỉnh trong chất lỏng và tôi đang cố gắng để có thể vượt qua các biến lỏng vào cuộc gọi cho thẻ mà như vậysử dụng các biến lỏng bên trong của một cuộc gọi thẻ lỏng

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

Tuy nhiên kết quả này trong tham số bài viết được chuyển thành 'id' thay vì 'cái gì đó' theo câu lệnh gán ở trên nó.

Có ai biết cách chuyển biến vào cuộc gọi thẻ không?

Trả lời

2

Không giống như thế này là có thể, giải pháp của tôi là chỉ cần vượt qua tên biến vào thẻ và lấy nó ra khỏi bối cảnh các thẻ đang được thực hiện tại như vậy:.

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

trong mã thẻ của tôi (đặc):

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

Làm thế nào để bạn kiểm tra này? – mhenrixon

5

tôi vừa mới giải quyết này rất đơn giản với Jekyll 0.11.2 và lỏng 2.3.0 bằng cách truyền tên của biến như tham số thẻ.

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

Bạn cũng có thể chuyển tên của điều khiển var trong vòng lặp, như article ở trên.

Trong Liquid::Tag.initialize, @markup là tham số thứ hai, chuỗi theo tên thẻ. Các biến được gán có sẵn ở cấp cao nhất của context.

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

Điều này rõ ràng chỉ cho phép một thông số được thông qua. Một giải pháp phức tạp hơn sẽ phân tích các tham số như x: 2, y: 3.

3

Điều này giải quyết được trường hợp của tôi context[@markup.strip].

Vấn đề của tôi là tôi muốn để có thể vượt qua một biến thẻ tùy chỉnh chất lỏng của tôi như thế này: {% get_menu main_menu navigation.html settings.theme.id %}

Để làm được điều này tôi lần đầu tiên chia chuỗi biến thành varaibles khác nhau trên tất cả các nhân vật không gian.

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) 

* Đây chỉ là một ví dụ phong phú hơn rằng câu trả lời ở trên bởi Jonathan Julian

0

Nó sẽ là tuyệt vời để có một thẻ có thể được gọi với literals và các biến như

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

hoặc

{% link_to_article 'art' %} 

hoặc

{% link_to_article "art" %} 

và cũng tất nhiên

{% link_to_article include.article %} 

Để vì vậy tôi đề nghị một hàm helper

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 

Và trong render chỉ gọi hàm helper để lấy giá trị của nghĩa đen hoặc biến .

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

FYI, các initialiser sẽ trông như thế này:

def initialize(tag_name, markup, tokens) 
    @markup = markup 
    super 
end 
Các vấn đề liên quan