【问题标题】:Injecting form options and input tags from the model从模型中注入表单选项和输入标签
【发布时间】:2013-12-26 22:26:56
【问题描述】:

如何向模型中带有form_for @user 的构建器生成的表单添加选项和字段? (即不接触 HTML)

我想这样做的原因是我正在向我的模型添加一个可插入模块,并且我希望它自动 (a) 在 HTML 中添加一个 data 属性以提供 Javascript 的钩子,并且 ( b) 在表单中添加一个额外的字段。

例如在我的模型中添加这样一个模块:

module Dataable
  def form_options
    { 'data-foo' => true }
  end

  def form_builder_extra_fields
    hidden_field_tag :the_data
  end
end

User.send :include, Dataable

会使form_for 输出:

<form {...} data-foo>
  <input type="hidden" name="user[the_data]" {...} />
  {...}
</form>

在视图中。

当然是我刚刚编出来的那些方法。因此,问题是双重的;如何在模型中动态添加 (1) 表单选项和 (2) 表单标签。

我现在正在窥探form_for,但我想知道是否有人知道。

【问题讨论】:

    标签: ruby-on-rails rails-models modular-design


    【解决方案1】:

    我不确定我是否完全理解您要执行的操作。如果您只想将一些信息从控制器传送到表单,以便稍后提交,并使用用户作为乘客。

    控制器

    @user.new
    @user.whatever = 'stuff'
    

    查看

    = form_for @user do |f|
      = hidden_tag 'user[whatever]', value: @user.whatever
    

    如果你一遍又一遍地重复它,并希望它在模型中

    型号

    def add_data
      self.whatever = 'stuff'
    end
    

    控制器

    @user.new
    @user.add_data()
    

    【讨论】:

    • 目标是不必修改视图是否包含模块。所以不包括模型中的模块不会使隐藏标签出现。隐藏标签将通过模块动态添加。
    【解决方案2】:

    简短回答:form_for 是一个助手,合理的做法是用一个助手覆盖它。我不确定我是否处于正确的抽象级别,但就目前而言,这似乎是可行的。

    助手将调用acts_like? 来确定模块是否已被包含。

    module UsersHelper
      def form_for_users(options = {}, &block)
        if @user.acts_like? :dataable
          options.deep_merge!({ html: { 'data-foo' => true } })
    
          new_block = Proc.new do |builder|
            content = capture(builder, &block)
    
            output = ActiveSupport::SafeBuffer.new
            output.safe_concat(tag :input, {type: 'hidden', name: 'user[the_data]'})
            output << content
          end
        else
          new_block = block
        end
    
        form_for(@user, options, &new_block)
      end
    end
    

    快乐的猴子补丁!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-14
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多