【问题标题】:Nested Forms, Validations and Error Messages嵌套表单、验证和错误消息
【发布时间】:2016-01-06 10:50:34
【问题描述】:

因此,在阅读了有关此主题的两天后,我在旧版本的 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 }

汽车.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

【问题讨论】:

  • 除了我的问题:当错误发生并且车牌字段被标记为红色时,它也会破坏我的格式。通常这两个字段排成一行,中间有一个破折号(德国车牌标准格式),但带有红色标记,它将字段移动到两个单独的行中。关于这个的任何提示也会有所帮助?

标签: ruby-on-rails validation ruby-on-rails-4 error-handling nested-forms


【解决方案1】:

好的,经过 2 天的阅读,我解决了它:

首先我将 accept_nested_attributes 从 car.rb 移动到 user.rb(并从复数到单数)

用户.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

所以这稍微清理了我的代码,我终于可以正确显示我的错误了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2015-10-23
    • 2018-03-27
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    相关资源
    最近更新 更多