在应用程序范围内为simple_form设置input_html值

时间:2018-08-16 08:14:22

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

我已经将simple_form从2.1.0升级到3.0.3(是的,还很老),Rails从3.2.22升级到了4.2.10,结果,我失去了{与textarea列关联的{1}}元素的默认值text为40,而cols的值为20。现在似乎没有为rows设置任何值和cols

是否可以配置simple_form来为应用程序范围内的rows的{​​{1}}设置列和行?还是我必须设置类似

textarea

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

我尝试搜索simple_form github存储库,而他们的Wiki中只有3个提及input_html的内容,没有一个解决了这个问题。

2 个答案:

答案 0 :(得分:2)

简单表单通过重新定义现有的简单表单输入提供了一种简便的方法来change the default behaviour (v3.0.3)。这是通过创建一个具有相同名称的新类来完成的。例如,如果要设置默认的 cols ,则可以执行以下操作:

# 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

答案 1 :(得分:1)

问题:

在Rails 4.2中,为文本区域colsrows设置全局默认值:

TL; DR:

因为 SimpleForm 3.0 Rails 4.2 似乎都没有公共API才能设置默认文本区域cols和{{1} }值(有关原因,请参阅下面的调试),然后提出以下解决方法:

解决方法1(测试正常):

创建以下文件:

rows

...将呈现任何textarea(simpleform构建器或rails表单构建器或text_area_tag)具有默认的cols和行,如下所示:

# 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

注意 ,这不是一种长期有效的解决方案,因为只能保证此特定版本的{ {1}}类。更高版本的Rails甚至次要版本可能无法正常工作!

解决方法2:

如果您只想为SimpleForm表单设置默认的cols和行,而不想为Rails表单设置默认值,那么也可以对<textarea class="text" cols="40" rows="20"></textarea> 进行补丁,而不是上面的“修补” ActionView::Helpers::Tags::TextArea上面的解决方法1和我的答案已经太长了,所以我跳过。但是,如果有人想知道,请告诉我,我会进行更新。

解决方法3:

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

调试:

我跟踪了执行代码:

  • SimpleForm "text" input

    ActionView::Helpers::Tags::TextArea
  • ...,它不建议在SimpleForm中使用公共API来设置全局默认列和行,因此在input_html_options之后:

    SimpleForm::Inputs::TextInput
  • ...也不建议在SimpleForm中使用公共API来设置全局列和行。因此,遵循了Rails的module SimpleForm module Inputs class TextInput < Base enable :placeholder, :maxlength def input @builder.text_area(attribute_name, input_html_options) end end end end (请参见上面的代码),这导致了我here

    # ...
    @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
    # ...
    
  • 其中哪一个导致了我here: for TextArea.new

    @builder.text_area
  • ...,它也没有公共API来设置全局列和行,因此在next here: for TextArea.new.render之后

    def text_area(object_name, method, options = {})
      Tags::TextArea.new(object_name, method, self, options).render
    end
    
  • ...,它也没有设置全局cols和行的公共API,这让我别无选择,只能使用上面的解决方法1“修补”代码。

琐事:

  • 当您说Rails 4不再为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 设置默认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 cols值时,我确认您是对的,因为似乎rows直到您可以看到here
  • 的Rails 3.2.13版