【问题标题】:Set input_html values application-wide for simple_form为 simple_form 设置应用程序范围的 input_html 值
【发布时间】:2018-08-16 08:14:22
【问题描述】:

我已将 simple_form 从 2.1.0 升级到 3.0.3(是的,仍然很旧),并将 Rails 从 3.2.22 升级到 4.2.10,结果似乎我丢失了 @ 的设置与text 列关联的987654322@ 元素默认为cols 为40,rows 为20。现在它似乎没有为colsrows 设置任何值。

是否可以配置 simple_form 为应用程序范围内的textarea 设置列和行?还是我必须设置类似的东西

<%= f.input :message, input_html: {cols: 40, rows: 20} %>

对于应用程序中的每个输入?

我尝试搜索 simple_form github repo,在他们的 wiki 中只提到了三个 input_html,没有一个解决了这个问题。

【问题讨论】:

  • 我认为他们文档中的唯一方法是构建一个custom wrapper。希望这会有所帮助!

标签: ruby-on-rails ruby-on-rails-4 simple-form


【解决方案1】:

Simple Form 通过重新定义现有的Simple Form 输入,提供了change the default behaviour (v3.0.3) 的简便方法。这是通过创建一个具有相同名称的新类来完成的。例如,如果你想设置默认的 rowscols,你可以这样做:

# app/inputs/text_input.rb
class TextInput < SimpleForm::Inputs::TextInput
  def input
    input_html_options[:cols] ||= 40
    input_html_options[:rows] ||= 20
    super
  end
end

【讨论】:

  • 哦!我认为 SimpleForm 没有这方面的 API。很高兴知道! :)
  • @Jay-ArPolidario 我从formtastic 的经验中知道这个,它基本上是simple_form 的增强版本。您将代码跟踪到SimpleForm::Inputs::TextInput,但对重新定义或自定义输入的检查是从表单生成器进行的。在代码执行到达输入类之前。 github.com/plataformatec/simple_form/blob/…
【解决方案2】:

问题:

在 Rails 4.2 中,为 textarea colsrows 设置全局默认值:

TL;DR:

因为似乎没有来自 SimpleForm 3.0Rails 4.2 的公共 API 能够设置默认 textarea colsrows 值(请参阅我的调试下面的原因),然后我想出了以下解决方法:

解决方法 1(测试工作):

创建以下文件:

# config/initializers/text_area_extensions.rb

module TextAreaExtensions
  def render
    @options[:cols] ||= 40
    @options[:rows] ||= 20
    super
  end
end

ActionView::Helpers::Tags::TextArea.class_eval do
  prepend TextAreaExtensions
end

... 会将任何 textarea(simpleform builder 或 rails form builder 或 text_area_tag)呈现为具有默认列和行,如下所示:

<textarea class="text" cols="40" rows="20"></textarea>

注意,这是一种解决方法,它不是一个长期稳健的解决方案,因为它只保证适用于 ActionView::Helpers::Tags::TextArea 类的特定版本.以后的 Rails 主要版本甚至次要版本都可能不起作用!

解决方法 2:

如果您只想为 SimpleForm 表单设置默认列和行但不为 Rails 表单设置默认值,但因为我更喜欢上面的解决方法 1 和我的回答已经太长了,所以我跳过。但如果有人有兴趣知道,请告诉我,我会更新此内容。

解决方法 3:

可能更好的方法是使用您可以调用的自定义方法(即视图辅助方法),该方法已经具有默认的列和行,而不是像上面的解决方法 1 那样“修补”gem 代码。但是,我的印象是您已经有一个大型应用程序,您只想简单地设置一个全局代码,而不是手动设置/更新所有受影响的视图文件(您甚至在上面说过),因此我的解决方法 1以上。

调试:

我追踪了执行代码:

  • SimpleForm "text" input:

    module SimpleForm
      module Inputs
        class TextInput < Base
          enable :placeholder, :maxlength
    
          def input
            @builder.text_area(attribute_name, input_html_options)
          end
        end
      end
    end
    
  • ...不建议在 SimpleForm 中使用公共 API 来设置全局默认列和行,因此遵循 input_html_options:

    # ...
    @input_html_options = html_options_for(:input, input_html_classes).tap do |o|
      o[:readonly]  = true if has_readonly?
      o[:disabled]  = true if has_disabled?
      o[:autofocus] = true if has_autofocus?
    end
    # ...
    
  • ...也不建议在 SimpleForm 中使用公共 API 来设置全局列和行。所以跟随 Rails 的@builder.text_area(见上面的代码),这导致我here

    def text_area(object_name, method, options = {})
      Tags::TextArea.new(object_name, method, self, options).render
    end
    
  • 其中导致我here: for TextArea.new

    def initialize(object_name, method_name, template_object, options = {})
      @object_name, @method_name = object_name.to_s.dup, method_name.to_s.dup
      @template_object = template_object
    
      @object_name.sub!(/\[\]$/,"") || @object_name.sub!(/\[\]\]$/,"]")
      @object = retrieve_object(options.delete(:object))
      @options = options
      @auto_index = retrieve_autoindex(Regexp.last_match.pre_match) if Regexp.last_match
    end
    
  • ...它也没有公共 API 来设置全局列和行,因此遵循next here: for TextArea.new.render

    def render
      options = @options.stringify_keys
      add_default_name_and_id(options)
    
      if size = options.delete("size")
        options["cols"], options["rows"] = size.split("x") if size.respond_to?(:split)
      end
    
      content_tag("textarea", options.delete("value") { value_before_type_cast(object) }, options)
    end
    
  • ...它也没有公共 API 来设置全局列和行,这让我别无选择,只能使用上面的解决方法 1 “修补”代码。

琐事:

  • 当你说 Rails 4 不再为textarea 设置默认值colsrows 时,我验证你是对的,因为似乎DEFAULT_TEXT_AREA_OPTIONS = { "cols" =&gt; 40, "rows" =&gt; 20 } 只在 Rails 版本 3.2.13 之前实现见here

【讨论】:

  • 有时我无法区分 simple_form 功能和 Ruby on Rails 功能,因此也感谢您调查 Rails 版本是否存在差异!
  • 完全没问题!乐意效劳! :) 我也很好奇,所以...哈哈
  • 对于那些想知道拉取请求和与此相关的问题的人,我可以看到pull request 5366 making the change,回复issue 5324simple_form issue 542 中也提到了它。他们谈到在升级指南中提到它......但它没有发生。
猜你喜欢
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 2012-04-26
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多