渲染后验证错误消失 'new'

Validation errors disappear after render 'new'

我有一个嵌套表单,它捕获两个模型的信息,游戏和团队

我的模特:

class Game < ApplicationRecord
    has_many :teams
    accepts_nested_attributes_for :teams
    validates_associated :teams
    validates :start_time, presence: true
end

class Team < ApplicationRecord
    belongs_to :game
    validates :name,  presence: true, length: { maximum: 50 }
end

保存记录之前,必须通过验证。如果保存失败,则应根据下面的控制器重新呈现表单并显示验证错误消息。但是,永远不会显示错误消息。

我的游戏控制器:

class GamesController < ApplicationController

    def new
        @game = Game.new
        @team = @game.teams.build
    end

    def create  
        @game = Game.new(game_params)

        unless @game.save
            render 'new'
            return
        end

        # Some other code that shouldn't run if the save fails, hence the 'return' above
        
    end
end

我的表格(new.html.erb):

<%= render 'shared/error_messages' %> 

<%= form_with model: @game do |f| %>
<%= f.fields_for :teams do |f_teams| %>

<%= f_teams.label :name %>
<%= f_teams.text_field :name, class: 'form-control'%>

<%= f.label :start_time, "Game day" %>
<%= f.date_field :start_time, id: "game_day", class: 'form-control' %>

<%= f.submit "Book now!", class: "btn btn-primary" %>

<% end %>
<% end %>

最后,部分错误消息:

<% if @game.errors.any? %>
<div id="error_explanation">
    <div class="alert alertdanger">
        The form contains <%= pluralize(@game.errors.count, "error") %>.
    </div>
    <ul>
        <% @game.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
        <% end %>
    </ul>
</div>
<% end %>

当我故意破坏验证(例如不包括比赛日)时,部分错误消息不会 运行,大概是因为 @game.errors.any? 是错误的。

如果我使用 byebug 或者如果我通过 rails 控制台,我会收到验证错误,例如start_time不能为空.

我在这里错过了什么?

编辑

克里斯的以下解决方案对我有用。但是,如果满足验证并保存成功,我希望我的控制器 运行 JS。所以我回去删除了建议的 local: true 并允许远程提交发生。我为解决此问题所做的是 render html if save didn't succeed:

unless @game.save
    respond_to do |format|
        format.html {   render 'new' }
    end
    return
end

这不是开箱即用的,因为 turbolinks 会干扰。因此,我最终将 gem 'turbolinks_render' 添加到我的 Gemfile 并且 voila 现在一切都很好。

非常感谢 Joel (https://joelc.io/ajax-ruby-on-rails-forms) 的演练。

在您的 new.html.erb 文件中,尝试

<%= form_with(model: @game, local: true) do |f| %>

这里有一些关于使用 form_with 标签的有用信息: https://medium.com/@tinchorb/form-with-building-html-forms-in-rails-5-1-f30bd60ef52d