我已经将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的内容,没有一个解决了这个问题。
答案 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中,为文本区域cols
和rows
设置全局默认值:
因为 SimpleForm 3.0 和 Rails 4.2 似乎都没有公共API才能设置默认文本区域cols
和{{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甚至次要版本可能无法正常工作!
如果您只想为SimpleForm表单设置默认的cols和行,而不想为Rails表单设置默认值,那么也可以对<textarea class="text" cols="40" rows="20"></textarea>
进行补丁,而不是上面的“修补” ActionView::Helpers::Tags::TextArea
上面的解决方法1和我的答案已经太长了,所以我跳过。但是,如果有人想知道,请告诉我,我会进行更新。
可能更好的方法是使用可以调用的自定义方法(即视图帮助器方法),该方法将已经具有默认的cols和行,而不是像上面的变通方法1那样“修补” gem代码。但是,我的印象是您已经拥有一个大型应用程序,您只想简单地设置一个全局代码,而不是手动设置/更新所有受影响的视图文件(您甚至在上面说过),因此我的解决方法1以上。
我跟踪了执行代码:
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“修补”代码。
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