帮助程序中的 Rails Form 块 - 如何包含“防止伪造”

2024-05-25

我正在尝试为我的液体主题语言构建一个表单块。我的方法基于这个答案 https://stackoverflow.com/questions/15189669/can-the-liquid-ruby-template-engine-deal-with-rails-forms。然而答案似乎并不完整。

问题是防伪和其他一些方法不可用。导致错误:

Liquid error: undefined method `protect_against_forgery?' for #

这是我的代码:

   class LiquidFormTag < Liquid::Block

        include ActionView::Context
        include ActionView::Helpers::FormHelper

        def initialize(tag_name, markup, tokens)

            super
        end

        def render(context)
            form_tag("#") do

                super
            end
        end
    end

    Liquid::Template.register_tag('liquid_form', LiquidFormTag)

有谁知道我如何添加protect_against_forgery这个类的方法?

Edit: this is the error output: enter image description here

Edit 2:

这是我的 Liquid 代码的相关部分:

{% ticket_form %}
    {% for offer in event.offers %}

        <div class="well well-sm">  
            <div class="row">
                <div class="col-xs-3 col-sm-5 col-md-6 col-lg-7">
                    <h5>{{offer.name}}</h5>
                </div>
                <div class="col-xs-9 col-sm-7 col-md-6 col-lg-5 pull-right">
                    <div class="input-group">
                        <span class="input-group-addon">{{offer.price}}</span>
                        <input type="email" class="form-control tickets-count" cols="2" id="exampleInputEmail1" placeholder="0">
                        <span class="input-group-btn">
                            <button type="button" class="btn btn-default"><i class="fa fa-plus"></i></button>
                            <button type="button" class="btn btn-default"><i class="fa fa-minus"></i></button>
                        </span>
                    </div>
                </div>
            </div>
        </div>

    {% endfor %}
{% endticket_form %}

我同意罗德里戈的观点,但很难确定将委托给控制器的方法名称。

这就是为什么我更喜欢延长Liquid::Block如果有响应,则类并将缺少的方法委托给控制器。

class LiquidFormTag < Liquid::Block
  include ActionView::Context
  include ActionView::Helpers::FormHelper

  attr_reader :controller

  def initialize(tag_name, markup, tokens)
    super
  end

  def render(context)
    @controller = context.registers[:controller]
    form_tag('#') do
      super(context).html_safe
    end
  end

end


Liquid::Block.class_eval do
  # This delegates missing - including private & protected - methods (like protect_against_forgery?) to controller.
  def method_missing(*args)
    begin
      if controller.respond_to?(args.first, true)
        controller.send(args.first)
      else
        super
      end
    rescue
      super
    end
  end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

帮助程序中的 Rails Form 块 - 如何包含“防止伪造” 的相关文章

随机推荐