Rails 4验证问题:表单在验证后不能提交

时间:2015-05-31 09:42:20

标签: ruby-on-rails forms validation

行。我在过去几周一直在学习Rails,我真的是个菜鸟。

我正在办理酒店预订系统。我们的想法是加载表单,验证字段并保存数据。如果没有任何验证错误,则会正确保存预订。但是如果表单显示一些验证错误,则提交按钮停止工作(我的意思是,我可以修复文本以便不会弹出验证错误,但一旦修复,我就无法提交新数据)。

这是模特:

class Reserva < ActiveRecord::Base
  validates :fecha_ingreso, :fecha_salida, presence: { message: " es un campo obligatorio" },
                            format: { with: /\d{2}\/\d{2}\/\d{4}/ , message: "Debe utilizar formato dd/mm/aaaa" }

  validates :canti_hues, :tipo_hab, :email, :peticion, presence: { message: " es un campo obligatorio" }

  validates :email, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i }



end

这是控制器:

  before_action :set_reserva, only: [:show, :edit, :update, :destroy]

  # GET /reservas
  # GET /reservas.json
  def index
    if user_signed_in?
      @reservas = Reserva.all
    else
      redirect_to :controller => 'home', :action => 'ingresar'
    end     
  end

  # GET /reservas/1
  # GET /reservas/1.json
  def show
  end

  # GET /reservas/new
  def new
    @reserva = Reserva.new
  end

  # GET /reservas/1/edit
  def edit
  end

  # POST /reservas
  # POST /reservas.json
  def create
    @reserva = Reserva.new(reserva_params)

    respond_to do |format|
      if @reserva.save
        format.html { redirect_to @reserva, notice: 'La reserva fue creada exitosamente.' }
        format.json { render :show, status: :created, location: @reserva }
      else
        format.html { render :new }
        format.json { render json: @reserva.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /reservas/1
  # PATCH/PUT /reservas/1.json
  def update
    respond_to do |format|
      if @reserva.update(reserva_params)
        format.html { redirect_to @reserva, notice: 'Reserva was successfully updated.' }
        format.json { render :show, status: :ok, location: @reserva }
      else
        format.html { render :edit }
        format.json { render json: @reserva.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /reservas/1
  # DELETE /reservas/1.json
  def destroy
    @reserva.destroy
    respond_to do |format|
      format.html { redirect_to reservas_url, notice: 'Reserva was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_reserva
      @reserva = Reserva.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def reserva_params
      params.require(:reserva).permit(:fecha_ingreso, :fecha_salida, :canti_hues, :tipo_hab, :email, :peticion)
    end
end

这是在视图中呈现的_form:

    <%= form_for(@reserva) do |f| %>
      <% if @reserva.errors.any? %>
        <div id="error_explanation">
          <h2><%= pluralize(@reserva.errors.count, "error") %> encontrado:</h2>

          <ul>
          <% @reserva.errors.full_messages.each do |message| %>
            <li><%= message %></li>
          <% end %>
          </ul>
        </div>
      <% end %>
      <div align='center'>
        <table border='1'>
            <td width=300 align='center'>   
              <div class="field">
                <%= f.label :fecha_ingreso %><br>
                <%= f.text_field :fecha_ingreso %>
              </div>
             <div class="field">
                <%= f.label :fecha_salida %><br>
                <%= f.text_field :fecha_salida %>
              </div>
              <div class="field">
                <%= f.label :cantidad_de_huespedes %><br>
                <%= f.number_field :canti_hues %>
              </div>
              <div class="field">
                <%= f.label :tipo_de_habitación %><br>
                <%= f.text_field :tipo_hab %>
              </div>
              <div class="field">
                <%= f.label :email %><br>
                <%= f.text_field :email %>
              </div>
              <div class="field">
                <%= f.label :peticiones_especiales %><br>
                <%= f.text_area :peticion %>
              </div>
              <div class="actions">
                <%= f.submit %>
              </div>
            </div>
          </td>
        </table>  

    <% end %>

如果验证错误已修复,为什么我不能提交? 谢谢你的回答!

1 个答案:

答案 0 :(得分:0)

我在项目中输入了代码 - 当我传入表单时:

fecha_ingreso: 22/22/1991
fecha_salida: 23/02/2222
canti_hues: 1
tipo_hab: abc
email: sample@example.com
peticion: abc

一切都过去了。记录保存得当。

当您尝试键入除数字以外的其他值字段时,can't be blank属性下会显示验证错误canti_hues。发生这种情况,因为来自number_field的非数字值根本不会发送到控制器。

另外,您需要做的是确保以正确的格式键入值到其他字段。

但是,在上面的代码中,没有什么可以引起任何意外问题。如果您没有与此表单对应的JavaScript,则唯一的解决方案是错误数据。

PS:快速建议 - 在rails应用程序中,始终用英语命名资源和属性。 Rails已经将机制安装到多元化和单一化,如果你将来想要使用它,你将不得不重构你的大部分代码。