2015-05-31 94 views
0

OK。過去幾周我一直在學習Rails,我真的是一個小菜鳥。Rails 4驗證問題:表單驗證無效後提交

我正在致力於酒店預訂系統。這個想法是加載一個表單,驗證字段,並保存數據。如果沒有任何驗證錯誤,則保留已妥善保存。但是,如果表單顯示一些驗證錯誤,提交按鈕停止工作(我的意思是,我可以修復文本,所以驗證錯誤不會彈出,但一旦修復,我就無法提交新數據)。

這是型號:

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 %> 

爲什麼我不能如果驗證錯誤已被修復,請提交? 謝謝你的回答!

+0

它是否顯示控制檯中的任何內容,即JavaScript相關?當你說按鈕不起作用,你的意思是它不可點擊? – osman

+0

請貼上相關'javascript' – DevMarwen

+0

請貼上你得到的錯誤 –

回答

0

我輸入您的代碼在我的項目 - 當我在表單傳遞:

fecha_ingreso: 22/22/1991 
fecha_salida: 23/02/2222 
canti_hues: 1 
tipo_hab: abc 
email: [email protected] 
peticion: abc 

一切經過。記錄保存正確。

驗證錯誤can't be blank出現在canti_hues屬性當您嘗試在字段中輸入其他值比數字。發生這種情況是因爲number_field中的非數字值根本沒有發送給控制器。

其他的事情,你需要做的是確保你輸入正確格式的值到其他字段。

但是,在上面的代碼中沒有任何可能引發任何意外問題的東西。如果您沒有與此表單對應的JavaScript,唯一的解決方案就是錯誤的數據。

PS:快速建議 - 在rails應用程序中總是用英文命名資源和屬性。 Rails已經將複雜化和單一化機制付諸實施,如果您將來想要使用它,您將不得不重構大部分代碼。