使用tr作为标签输入包装器的简单形式

时间:2013-01-14 20:46:27

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

我可能已经读完了,我已经经历了很多div / span尝试并且一次性抛出桌子,但桌子只有一些好的用途,其中一个是imho,是一种形式。我更喜欢使用不同的背景颜色来遮蔽我的标签字段。我尝试过可能的方法,但如果输入(实际上是)侧面溢出宽度,它将搞乱标签背景。我会看另一次尝试,但我更喜欢表格方法。

在2.x中,我将配置设置为:

config.wrappers :tag => :tr, :class => :input,
  :hint_class => :field_with_hint, :error_class => :field_with_errors do |b|

  b.use :label, :wrap_with => {:tag => :td, :class => :label}
  b.use :input, :wrap_with => {:tag => :td, :class => :input}
  b.use :hint,  :wrap_with => { :tag => :span, :class => :hint }
  b.use :error, :wrap_with => { :tag => :caption, :class => :error }

效果很好!除了错误。我首先把它作为一个跨度,它走到了桌面的顶端。然后我将它设置为标题,至少在Safari中,它结束tbody并放入标题并启动另一个tbody - 但它会搞砸表流。

有没有办法可以强制错误出现在输入包装器中?还是其他方法?我甚至接受(也许这就是我应该做的)将错误放在主要消息中,如脚手架方法。在我开始写这篇文章之前没有想过,但我想我不能使用简单的表单错误的东西,并回到脚手架的方法。

至少我认为你可以做到这一点。例如,我不知道(并且在文档中找不到 - 但我看起来并不是很难!)你可以使用与f.input混合的常规form_for输入(例如,f.text_field)。非常适合将City,St,Zip放在一排。

1 个答案:

答案 0 :(得分:0)

我想我应该回答我自己的问题。我最终没有使用Simple Forms错误通知,而是回到了scaffold方法。

我按如下方式配置了包装器:

config.wrappers :tag => :tr, :class => :input,
  :hint_class => :field_with_hint, :error_class => :field_with_errors do |b|
    b.use :label, :wrap_with => {:tag => :td, :class => :label}
    b.use :input, :wrap_with => {:tag => :td, :class => :input}

为错误写了一个帮助方法:

def show_form_errors(instance)
  if instance.errors.any?
    errors = content_tag(:h2, pluralize(instance.errors.count, "error") +"prohibited this project from being saved:")
    list = content_tag :ul do
      e = ""
      instance.errors.full_messages.each do |msg|
        e <<"<li>#{msg}</li>"
      end
      e.html_safe
    end
    return content_tag(:div, (errors + list),:id => "error_explanation").html_safe
  end
end

# instead of
  # = f.error_notification
# I used
  # = show_form_errors(@event)

因为我在表行(只是border-bottom)上定义了边框,并且添加!important以用红色边框包裹tr,所以必须调整CSS for error_explanation:

.field_with_errors {
  padding: 2px;
  border:solid 3px red!important;
  background-color:pink;
}

工作正常,我对这种方法感到满意。