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

时间:2014-02-07 22:42:37

标签: ruby-on-rails validation simple-form unobtrusive-javascript

我的视图顶部有一个显示图像列表的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'

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

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

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

如果提交的表单没有:how_soon的值,则表单会重新显示,但我看不到特定的value 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

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

虽然我简化了上面的代码,但我实际上是使用最终用于创建两个对象的表单对象来呈现表单,UserListing(想想作业列表)。与Listing相关的属性都是由用户点击他们想要的图片填充的所有隐藏值,并通过表单中的jquery设置相应的值。 User属性都存在。这是可能与我的问题相关的奇怪的一点:

当我只有可见属性的错误(所有属性都是User属性)时,错误会在其属性上正确显示。但是,如果隐藏属性上的可见属性错误出现错误,则根本不显示可见属性的错误,我只是在顶部获得通用Please review the problems below:通知形式。

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

1 个答案:

答案 0 :(得分:0)

通过向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!