【问题标题】:Ruby on rails - Simple form not displaying errors for radio select. Other errors display fineRuby on rails - 简单的表单不显示单选选择错误。其他错误显示正常
【发布时间】:2016-10-12 06:19:28
【问题描述】:

我有一个包含 4 个元素的用户注册表单(Devise);用户名、电子邮件、密码和“用户类型”。用户类型是布尔值,在表单上显示为单选。

用户名、电子邮件和密码错误显示没有问题,但如果用户没有选择单选按钮之一,我没有收到任何错误消息。验证已经到位,如果没有选择其中一个单选按钮,表单将不会发送,但我没有收到任何错误。

形式:

<%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
            <%= f.error_notification %>
        <div class="role-selector">
            <p class="type-sel-txt"><%= t('front.whattype') %></p>
            <label for="artistuser">
                <%= f.radio_button :artist, "1", :id => "artistuser" %>
                <span class="artistuser-sel"><%= t('front.bandm') %></span>
            </label>
            <label for="eventuser">
                <%= f.radio_button :artist, "0", :id => "eventuser" %>
                <span class="eventuser-sel"> <%= t('front.evento') %></span>
            </label>
        </div>
        <%= f.input :username, required: true, autofocus: true, placeholder: t('forms.login.user'), label: false %>
        <%= f.input :email, required: true, placeholder: t('forms.login.email'), label: false %>
        <%= f.input :password, required: true, placeholder: t('forms.login.password'), label: false %>
        <div id="passcheck"></div>
        <%= f.button :submit, t("forms.login.signup"), id: "register-btn" %>
    <% end %>

用户.rb:

  validates_inclusion_of :artist, in: [true, false], on: :create

注册没有问题,我唯一的问题是没有显示错误。我不确定是否需要粘贴更多代码,但如果需要,我会根据需要进行更新。

【问题讨论】:

  • 没有错误,因为在这种情况下验证总是有效的。我的意思是,如果用户不选择任何内容,则值artist 为false,并且false 符合您的要求,因此没有错误。
  • artist 的值不是 false,因为如果未选择任何内容,它默认为 nil。这可以确认,因为如果未在表单中选择 artist 布尔值,则表单将不会发送。

标签: ruby-on-rails error-handling devise simple-form


【解决方案1】:

相对于简单表单的f.input处理除了输入本身之外的所有相关标签(标签标签,错误消息标签),f.radio_button只处理输入字段,因为它实际上是a helper from ActionView,并不简单形式。

当字段附加一些错误时,默认情况下,简单表单会生成带有“错误”类的span。我猜你必须自己渲染跨度,就像你为字段标签所做的那样:

<div class="role-selector">
  <p class="type-sel-txt"><%= t('front.whattype') %></p>
  <label for="artistuser">
     <%= f.radio_button :artist, "1", :id => "artistuser" %>
     <span class="artistuser-sel"><%= t('front.bandm') %></span>
  </label>
  <label for="eventuser">
     <%= f.radio_button :artist, "0", :id => "eventuser" %>
     <span class="eventuser-sel"> <%= t('front.evento') %></span>
  </label>

  <!-- show error for the artist attribute, if present -->
  <% if resource.errors['artist'].present? %>
    <span class="error"><%= resource.errors['artist'] %></span>
  <% end %>
</div>

【讨论】:

    【解决方案2】:

    我无法完全弄清楚发生了什么,但你可以尝试一些 hack 之类的东西

    <%= f.radio_button :artist, "1", :id => "artistuser", :selected => f.object.artist %>
    

    然后你可以检查它是否存在

    <% if f.object.artist.blank? %>
      Display Your Error Message
    

    只是一个粗略的想法,但只需稍加修改即可使其工作,如果有任何问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 2010-11-04
      • 1970-01-01
      相关资源
      最近更新 更多