- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在使用 Bootstrap 3 和 Rails 4,我想创建一个自定义 FormBuilder 来处理一些 Bootstrap 独特的 HTML 语法。具体来说,我需要一个自定义帮助程序来围绕表单字段创建 form-group
div 包装器,因为 Bootstrap applies error state to this wrapper, and not the field itself ...
<div class="form-group has-error">
<label class="col-md-3 control-label" for="user_email">Email</label>
<div class='col-md-9'>
<input class="form-control required-input" id="user_email" name="user[email]" placeholder="peter@example.com" type="email" value="someone@example.com" />
</div>
</div>
注意外层 div 中的额外类 has-error
...
无论如何,我写了那个助手,而且效果很好!
def form_group(method, options={})
class_def = 'form-group'
class_def << ' has-error' unless @object.errors[method].blank?
class_def << " #{options[:class]}" if options[:class].present?
options[:class] = class_def
@template.content_tag(:div, options) { yield }
end
# Here's a HAML sample...
= f.form_group :email do
= f.label :email, nil, class: 'col-md-3 control-label'
.col-md-9
= f.email_field :email, class: 'form-control required-input', placeholder: t('sample.email')
现在我想利用 Bootstrap 的 form help text为了显示错误信息。这需要我扩展 Rails native 助手(例如上面示例中的 text_field
),然后在 f.form_group
的 block 内调用它们。
解决方案似乎足够简单:调用父级,并将我的 span block 附加到末尾...
def text_field(method, options={})
@template.text_field(method, options)
if !@object.errors[method].blank?
@template.content_tag(:span, @object.errors.full_messages_for(method), class: 'help-block')
end
end
只是它不会输出任何 HTML,div 只会显示为空。我尝试了一堆不同的语法方法:
super
对比 text_field
对比 text_field_tag
concat
-ing 结果 -- @template.concat(@template.content_tag( [...] ))
def text_field(method, *args)
然后是 options = args.extract_options!.symbolize_keys!
我只会遇到奇怪的语法错误,或者一个空的 div
。在某些情况下,input
字段会出现,但帮助文本 span
不会出现,反之亦然。
我确定我搞砸了一些简单的事情,只是我没有看到。
最佳答案
花了几天时间,但我最终偶然发现了正确的语法。希望它能拯救其他人的理智!
Ruby 的return
automagic,结合 Rails 有时复杂的作用域,让我失去了平衡。具体来说,@template.text_field
绘制内容,但它必须由辅助方法返回才能出现在调用 block 内。但是我们必须返回两次调用的结果...
def text_field(method, options={})
field_errors = object.errors[method].join(', ') if !@object.errors[method].blank?
content = super
content << (@template.content_tag(:span, @object.errors.full_messages_for(method), class: 'help-block') if field_errors)
return content
end
我们必须返回父方法(通过 super
)加上我们自定义的 @template.content_tag(:span,
注入(inject)的结果。我们可以将其缩短为使用 Ruby 的加号 +
运算符连接返回结果。
def text_field(method, options={})
field_errors = object.errors[method].join(', ') if !@object.errors[method].blank?
super + (@template.content_tag(:span, @object.errors.full_messages_for(method), class: 'help-block') if field_errors)
end
注意:表单是使用 ActiveModel 对象启动的,这就是我们可以访问 @object
的原因。实现 form_for
而不将其与模型关联将需要您改为扩展 text_field_tag
。
这是我完成的自定义 FormBuilder
class BootstrapFormBuilder < ActionView::Helpers::FormBuilder
def form_group(method, options={})
class_def = 'form-group'
class_def << ' has-error' unless @object.errors[method].blank?
class_def << " #{options[:class]}" if options[:class].present?
options[:class] = class_def
@template.content_tag(:div, options) { yield }
end
def text_field(method, options={})
field_errors = object.errors[method].join(', ') if !@object.errors[method].blank?
super + (@template.content_tag(:span, @object.errors.full_messages_for(method), class: 'help-block') if field_errors)
end
end
不要忘记告诉 form_for
!
form_for(:user, :builder => BootstrapFormBuilder [, ...])
编辑:这里有一些有用的链接,它们帮助我走上了启蒙之路。 Link-juice 感谢作者!
关于ruby-on-rails - 如何扩展核心 Rails FormBuilder 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22183500/
我有类似的问题: How do I resolve the error I am encountering using custom Validator syntax? FormBuilder gro
我有一个 CRUD 网络表,用于添加、编辑、删除......我使用 FormBuilder 进行表单验证。 this.saisieForm = this.fb.group({ 'val1':
我想知道是否有一种方法可以使用 Angular 2 的 FormBuilder 设置嵌套属性,如下所示: this.form = formBuilder.group({ name: ['', Va
我有这个实现 FormBuilder 的表单。 我需要在输入字段下显示我的自定义验证消息。使用下面的代码,验证器可以在输入字段为空白但不显示我的自定义验证时显示红色的“错误”文本。 .html 和 .
我正在尝试实现一个异步验证器但没有成功...... 我的组件创建了一个表单: this.personForm = this._frmBldr.group({ lastname: [ '', Va
我试图使用 Angular FormBuilder 提供的额外参数映射 group(controlsConfig: { [key: string]: any; }, extra: {
我将我的项目迁移到 angular 11,我注意到我添加的全局验证使 FormBuilder.group不推荐使用以下消息: group is deprecated: This api is not
根据 the Reactive Forms documentation ,我可以从 重构我的 FormGroup 定义 this.heroForm = this.fb.group({ name:
我通过扩展选择字段 (following the tutorial in the cookbook) 创建了自定义“状态”表单类型。选择字段的选项是根据通过服务注入(inject)的参数自动填充的。但
Angular 2,4 formbuilder setvalue() 在下拉选择中使用时无法按预期工作。 我有以下由 Github 组织填充的下拉选择: {{org.organizati
如何在选择的多个上正确构建 FormBuilder? 它只有在没有多重的情况下才有效。 我尝试在 HTML 中使用 FormArray、FormGroupName,但是,都返回错误。而且我遇到的例子总
我正在使用以下 jQuery Formbuilder ( http://formbuilder.readthedocs.io/en/latest/formBuilder/options/typeUse
我使用 Formbuilder 创建一个 FormGroup: myForm = this.fb.group( { title: [""],
我在 Angular 4 中使用 FormBuilder,当没有填写所有字段时,我需要禁用提交按钮。 component.ts public loginForm = this.fb.group({ e
根据 API 文档,更改嵌套值的正确方法是使用方法 patchValue myForm.patchValue({'key': {'subKey': 'newValue'}}); 但如何更改嵌套数组中的
当您有非常定制化的需求时,将 formbuild 与 pylons 结合使用实际上比手动创建您自己的表单 html 更容易吗? 最佳答案 我真的更喜欢纯 html,但它 super 简单使用如下语法填
Angular doc here您可以看到下面的实现。即在 constructor() 中声明 formBuilder 和服务。我知道在 constructor() 中使用服务是一种不好的做法。即我们
我有简单的 Angular FormBuilder 表单(在 Ionic 2 应用程序中),包含 3 个字段: constructor(public navCtrl: NavController, p
我使用 Wagtail 贡献的表单构建器模块在 Wagtail Admin 中创建了一个简单的联系人表单。该表单具有动态添加的字段Name、Email、Subject和Message;模型 Conta
我在一些选择选项中有一个硬空间 ( )。不知何故,在某个地方,他们正在逃脱。我试过: {% autoescape false %} {{ form_widget(foobar) }} {% e
我是一名优秀的程序员,十分优秀!