渲染后验证错误消失 '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
我有一个嵌套表单,它捕获两个模型的信息,游戏和团队。
我的模特:
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