嵌套表单、验证和错误消息
Nested Forms, Validations and Error Messages
因此,在阅读了两天关于这个主题的文章后,我感到迷失在旧版本 rails 的问题和一些我可能做错的个别事情之间。
我有一个用户可以创建帐户的表单。每个用户都需要输入他的车牌号,如果该车牌号还不存在并分配给用户,则会创建一辆汽车。
我的表单显示用户的验证错误消息,但不显示汽车的验证错误消息(它只将车牌的输入字段标记为红色)。
所以我的问题是:如何正确显示要呈现的错误消息?
在阅读了所有主题之后,我还怀疑我的用户控制器可能正在做一些我不应该手动做的事情。
我的表格:
<%= form_for(@user, html: { multipart: true }) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class="row">
<div class="col-xs-6 col-xs-offset-3">
<%= render 'shared/error_messages', object: f.object %>
<%= f.label :name %>
<%= f.text_field :name, class: 'form-control' %>
<%= f.label :email %>
<%= f.email_field :email, class: 'form-control' %>
<%= f.label :password %>
<%= f.password_field :password, class: 'form-control' %>
<%= f.label :password_confirmation, "Bestätigung" %>
<%= f.password_field :password_confirmation, class: 'form-control' %>
</div>
</div>
<div class="row">
<div class="col-xs-6 col-xs-offset-3">
<%= f.fields_for :car, @car do |car| %>
<%= car.label :plateprefix, "Nummernschild" %>
<div class="form-inline">
<%= car.text_field :plateprefix %>
<%= car.label :plate, "-" %>
<%= car.text_field :plate %>
</div>
<% end %>
</div>
</div>
user.rb:
class User < ActiveRecord::Base
belongs_to :car, inverse_of: :users
validates :name, presence: true, length: { maximum: 50 }
car.rb:
class Car < ActiveRecord::Base
has_many :users, inverse_of: :car
accepts_nested_attributes_for :users
validates :plateprefix, presence: true
最后是我的汽车控制器:
def new
@user = User.new
end
def create
if verify_recaptcha
@user = User.new(user_params)
if Car.exists?(:country => 'D', :plateprefix => params[:user][:car][:plateprefix].upcase, :plate => params[:user][:car][:plate].upcase)
@car = Car.find_by(:country => 'D', :plateprefix => params[:user][:car][:plateprefix].upcase, :plate => params[:user][:car][:plate].upcase)
@user.car_id = @car.id
else
@car = Car.new(:country => 'D', :plateprefix => params[:user][:car][:plateprefix].upcase, :plate => params[:user][:car][:plate].upcase)
@car.country = 'D'
@car.save
@user.car_id = @car.id
end
if @user.save
@user.send_activation_email
flash[:info] = "Please check your email to activate your account."
redirect_to root_url
else
@user = User.new
render 'new'
end
else
@user = User.new
render 'new'
end
end
好的,经过 2 天的阅读,我解决了这个问题:
首先,我将 accepts_nested_attributes 从 car.rb 移动到 user.rb(从复数到单数)
user.rb
accepts_nested_attributes for :car
但是出于某种原因,在我的表单中,我不得不将 fields_for 中的变量更改为复数 (:cars - rails 中的某些魔法超出了我的范围,但我认为我正在到达那里)
接下来我还重新创建了我的控制器以使用 ActiveModel/Record 提供的方法并去做:
if Car.exists?(:country => 'D', :plateprefix => params[:user][:cars][:plateprefix].upcase, :plate => params[:user][:cars][:plate].upcase)
@user.car = Car.find_by(:country => 'D', :plateprefix => params[:user][:cars][:plateprefix].upcase, :plate => params[:user][:cars][:plate].upcase)
else
@user.create_car(:country => 'D', :plateprefix => params[:user][:cars][:plateprefix].upcase, :plate => params[:user][:cars][:plate].upcase)
end
所以这稍微清理了我的代码,我终于正确显示了我的错误!
因此,在阅读了两天关于这个主题的文章后,我感到迷失在旧版本 rails 的问题和一些我可能做错的个别事情之间。
我有一个用户可以创建帐户的表单。每个用户都需要输入他的车牌号,如果该车牌号还不存在并分配给用户,则会创建一辆汽车。 我的表单显示用户的验证错误消息,但不显示汽车的验证错误消息(它只将车牌的输入字段标记为红色)。
所以我的问题是:如何正确显示要呈现的错误消息? 在阅读了所有主题之后,我还怀疑我的用户控制器可能正在做一些我不应该手动做的事情。
我的表格:
<%= form_for(@user, html: { multipart: true }) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class="row">
<div class="col-xs-6 col-xs-offset-3">
<%= render 'shared/error_messages', object: f.object %>
<%= f.label :name %>
<%= f.text_field :name, class: 'form-control' %>
<%= f.label :email %>
<%= f.email_field :email, class: 'form-control' %>
<%= f.label :password %>
<%= f.password_field :password, class: 'form-control' %>
<%= f.label :password_confirmation, "Bestätigung" %>
<%= f.password_field :password_confirmation, class: 'form-control' %>
</div>
</div>
<div class="row">
<div class="col-xs-6 col-xs-offset-3">
<%= f.fields_for :car, @car do |car| %>
<%= car.label :plateprefix, "Nummernschild" %>
<div class="form-inline">
<%= car.text_field :plateprefix %>
<%= car.label :plate, "-" %>
<%= car.text_field :plate %>
</div>
<% end %>
</div>
</div>
user.rb:
class User < ActiveRecord::Base
belongs_to :car, inverse_of: :users
validates :name, presence: true, length: { maximum: 50 }
car.rb:
class Car < ActiveRecord::Base
has_many :users, inverse_of: :car
accepts_nested_attributes_for :users
validates :plateprefix, presence: true
最后是我的汽车控制器:
def new
@user = User.new
end
def create
if verify_recaptcha
@user = User.new(user_params)
if Car.exists?(:country => 'D', :plateprefix => params[:user][:car][:plateprefix].upcase, :plate => params[:user][:car][:plate].upcase)
@car = Car.find_by(:country => 'D', :plateprefix => params[:user][:car][:plateprefix].upcase, :plate => params[:user][:car][:plate].upcase)
@user.car_id = @car.id
else
@car = Car.new(:country => 'D', :plateprefix => params[:user][:car][:plateprefix].upcase, :plate => params[:user][:car][:plate].upcase)
@car.country = 'D'
@car.save
@user.car_id = @car.id
end
if @user.save
@user.send_activation_email
flash[:info] = "Please check your email to activate your account."
redirect_to root_url
else
@user = User.new
render 'new'
end
else
@user = User.new
render 'new'
end
end
好的,经过 2 天的阅读,我解决了这个问题:
首先,我将 accepts_nested_attributes 从 car.rb 移动到 user.rb(从复数到单数)
user.rb
accepts_nested_attributes for :car
但是出于某种原因,在我的表单中,我不得不将 fields_for 中的变量更改为复数 (:cars - rails 中的某些魔法超出了我的范围,但我认为我正在到达那里)
接下来我还重新创建了我的控制器以使用 ActiveModel/Record 提供的方法并去做:
if Car.exists?(:country => 'D', :plateprefix => params[:user][:cars][:plateprefix].upcase, :plate => params[:user][:cars][:plate].upcase)
@user.car = Car.find_by(:country => 'D', :plateprefix => params[:user][:cars][:plateprefix].upcase, :plate => params[:user][:cars][:plate].upcase)
else
@user.create_car(:country => 'D', :plateprefix => params[:user][:cars][:plateprefix].upcase, :plate => params[:user][:cars][:plate].upcase)
end
所以这稍微清理了我的代码,我终于正确显示了我的错误!