gpt4 book ai didi

ruby-on-rails - 如何在表单声明 block 之外添加额外的表单字段

转载 作者:行者123 更新时间:2023-12-04 04:31:44 25 4
gpt4 key购买 nike

主要目标:允许插件,gem将其他表单字段添加到预定义的表单中。

例如,应用程序具有设计登录表单:

<%= form_for(resource, :as => resource_name, ...) do |f| %>
<%= devise_error_messages! %>
...
<% end %>

营销部门希望在接下来的两天内开始广告系列(例如:注册促销代码并获得X奖励积分)。因此,我们需要在所有注册表格中添加一个额外的 promo code字段。

有没有办法从我的rails-plugin/railtie中向表单添加一个额外的字段,并定义一个 on_submit回调方法(对我的其他字段数据采取措施)?

好处:
  • 只需将其从gem文件
  • 中删除,即可在2天或一周内删除该功能
  • 保证核心站点的功能不被破坏,它只是退回到原始功能
  • 确保开发人员没有在主应用程序
  • 中的任何地方留下任何代码
  • 插件/railtie负责保存/更新属于它的数据

  • 看了一下ActionView代码,似乎没有内置的方法可以执行此操作。你的想法是什么?

    注意:Drupal的 form_alter Hook 是一个很好的例子。

    最佳答案

    首先,将这个代码隔离在gem/railtie/engine中的想法很棒。我认为您最好的选择是猴子修补form_for方法并坚持使用多余的字段。关于提交触发,如果您在Rails 3.1上并且正在使用 Assets 管道,那么您也可以让gem提供javascript,尽管这需要对application.js进行一些小的更改才能要求gem的js文件,例如require 'promo/application.js,如果该 gem 被称为“促销”。

    看看Customized Form Builder的文档

    尽管我还没有尝试过这段代码,但是这里有一些粗略的想法,它如何工作。我将其放在RailtieEngine子类的promo.rb文件中。

    ActiveSupport.on_load(:action_view) do

    module ActionView
    module Helpers
    module FormHelper
    extend ActiveSupport::Concern

    included do
    alias_method_chain :form_for, :promo_code
    end

    module InstanceMethods

    def form_for_with_promo_code(record, options = {}, &proc)
    output = form_for_without_promo_code(record, options.merge(builder: FormBuilderWithPromoCode), proc)
    # See file: actionpack-3.1.3/lib/action_view/helpers/form_helper.rb for details
    # the output will have "</form>" as the last thing, strip that off here and inject your input field
    promo_field = content_tag :input, name: 'promo_code' # you can also run this through the proc if you want access to the object
    output.sub(%r{</form>$},promo_field+'</form>')
    end
    end
    end
    end
    end
    end

    在路上,特别是如果您的营销部门可能会运行更多的广告系列,则您甚至可能希望更改应用程序的形式,以指向特定的构建器,您可以在不给猴子打补丁的情况下从gem覆盖该构建器。

    关于ruby-on-rails - 如何在表单声明 block 之外添加额外的表单字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9197109/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com