我有用于在表单中设置隐藏值的 javascript,如何显示相关隐藏属性的错误消息?

I have javascript I use to set a hidden value in a form, how do I show an error message for the associated hidden attribute?

提问人:Ecnalyr 提问时间:2/8/2014 更新时间:2/9/2014 访问量:239

问:

我有一个视图,顶部有一个 div,显示图像列表,然后在底部显示一个表单:

%div{ id: 'how-soon' }
  %ul
    - %w( now week month browsing ).each do |hs|
      %li{ class: 'inactive', id: hs }=image_tag "how-soon/#{hs}.jpg"

= simple_form_for @employer_signup, :url => url_for(:action => 'create', :controller => 'home'), method: :post do |f|
  = f.error_notification

  .form-inputs
    = f.hidden_field :how_soon

  .form-actions
    = f.button :submit, 'Join Now'

当用户单击 div 中的一个图像时,此 coffeescript 会在以下表单中设置一个隐藏值:#how-soon

$("#how-soon > ul > li").click ->
  $(this).siblings('.active').toggleClass('inactive active')
  $(this).toggleClass('inactive active')
  $('#employer_signup_how_soon').val($(this).attr('id'))

在表单中调整的属性由其父模型验证其存在性,:how_soonvalidates :how_soon, presence: true

如果提交表单时没有表单的值,则会重新显示该表单,并且我看不到特定错误,因为该字段已隐藏。:how_soonvalue missing

一个典型的解决方案似乎是将错误放入另一个属性的错误中并在那里显示它们,但我没有显示此模型中可见的其他属性,因此我无法以这种方式显示错误。我会用这样的东西来做到这一点:

after_validation :validate_how_soon

protected

def validate_how_soon
  if errors[:how_soon].present?
    errors[:how_soon].each { |message| errors.add :first_name, message }
  end
end

奖励内容(可能不需要解决我的问题):

虽然我简化了上面的代码,但我实际上是使用一个表单对象来呈现表单,该表单对象最终用于创建两个对象,a 和 a(想想工作列表)。与相关的属性都是用户点击他们想要的图片并通过jquery在表单中设置相应值时填写的隐藏值。这些属性都存在。以下是可能与我的问题相关的奇怪部分:UserListingListingUser

当我只有可见属性(碰巧都是属性)有错误时,错误会相应地显示在它们的属性上。但是,如果我在可见属性上有错误,在隐藏属性上有错误,则根本不显示可见属性的任何错误我只会在表单顶部收到通用通知。UserPlease review the problems below:

就像我说的,这个“奖励内容”实际上可能没有帮助解决这个问题,但我想无论如何我都会把它留在这里。

Ruby-on-Rails 验证 简单形式 不显眼的 JavaScript

评论

0赞 CBroe 2/8/2014
如果隐藏字段是由你的 JS 填充的,那么它没有值的情况怎么会发生呢?(如果填充它依赖于用户与其他字段的交互,则如果未执行触发隐藏字段填充的正确操作,则应将其验证设置为失败。
0赞 Ecnalyr 2/9/2014
@CBroe 我设置隐藏值的方式是 nil,直到他们“点击”其中一张图像。可点击的图像本身没有验证,因为我(并希望继续)依靠简单表单帮助程序来创建带有错误通知的表单,而我使用的图像 + javascript 只是我创建的一个简单的小部件来填充隐藏字段的值。

答:

0赞 Richard Peck 2/9/2014 #1

通过向你的 Rails 后端提交表单,无论它是否隐藏,如果你没有填写正确的数据,验证仍然会返回错误

您可以像处理“普通”字段一样处理隐藏字段:

validates :how_soon, presence: true

这不会带回您需要的错误吗?


您必须在表单中包含以下内容:

<% if resource.errors.full_messages.present? %>
        <!-- Errors -->
    <ul>
         <% resource.errors.full_messages.each do |msg| %>
              <li><%= msg %></li>
         <% end %>
    </ul>
<% end %>

如果您让我们知道错误哈希的响应,我们将能够更好地直接帮助解决 iissue!