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

标签 ruby-on-rails ruby-on-rails-3 ruby-on-rails-plugins

主要目标:允许插件,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/

    相关文章:

    css - rails : Change next_page class of will_paginate gem

    ruby-on-rails - 从 Rails 中的多个表中选择总和结果

    ruby-on-rails - I18n 和 i18n-active_record - 没有 I18n::Backend::ActiveRecord 类?

    ruby-on-rails - 如何正确扩展 Rails Engine 的 Controller ?

    ruby-on-rails - 如何在还包含其他字段的表单中立即仅上传图像?

    ruby-on-rails - 无方法错误 : undefined method `save' rails console

    ruby-on-rails - Rails ransack gem 以键值对作为参数搜索 jsonb 列

    ruby-on-rails-3 - 如何在 Rails 应用程序中处理定期/订阅计费?

    ruby-on-rails - Rails 3.1 可安装引擎 : How to use/template it inside another application?

    Rails 3(beta 4)安装后出现 Sqlite3 错误