【问题标题】:Unable to set liquid template for rails app model无法为 Rails 应用程序模型设置液体模板
【发布时间】:2020-12-10 03:36:14
【问题描述】:

我在一个项目中工作,我想根据与海关查询的关联动态创建小部件,并设置液体以自定义小部件的外观和感觉。我能够设置液体,但是当我尝试使用 for 循环进行迭代时,我无法获取值,但如果我将对象称为字符串,那么我能够获取它:{"netsales"=>42410110.43}

型号:

class Widget < Accpac::Sqlserver::Base
  validates :name, :description, :template, presence: true
  belongs_to :user
  has_many :widget_queries, dependent: :destroy
  has_many :queries, through: :widget_queries

  def to_liquid
    { 
      'query_list' => query_list
    }
  end

  def query_list
    @result = ActiveRecord::Base.connection.exec_query(queries.map(&:statement).join(""))
    @result.to_a.join("")
  end
end

查看:

<div class="row">
  <div class="col-lg-12">
    <div class="wrapper wrapper-content animated fadeInUp">
      <div class="ibox">
        <div class="ibox-content">
          <div class="row">
            <%= Liquid::Template.parse(@widget.template).render('widget' => @widget) %>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

小部件模板:

{% for q in widget.query_list %}
    {{ q.netsales }}
{% endfor %}

# Output blank

【问题讨论】:

    标签: ruby-on-rails liquid


    【解决方案1】:

    要使用液体访问 rails 模型对象,您必须为特定模型创建 drop。基本上,liquid 允许用户自定义事物,并且 drop 可以防止用户对您的数据库做一些时髦的事情。

    您必须为想要通过液体访问的每个模型创建水滴。在你的情况下,它会是这样的:

    module Drops
      class WidgetDrop < Liquid::Drop
       
       def  initialize(widget)
        @widget = widget
       end
    
       def name
        @widget["name"]
       end
    
       ...
    
    end
    

    创建 drop 后,您可以在解析之前将其分配给模板:

    template.assigns['widget'] = Drops::WidgetDrop.new(widget)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      相关资源
      最近更新 更多