2016-11-02 136 views
0

是否可以在ajax中的Flash消息中顯示窗體的錯誤?當由於唯一字段而無法保存記錄時,我想顯示錶單的錯誤。Flash消息(ajax)

我的索引

<!--<p id="notice"><%= notice %></p>--> 
<h1>Empresas</h1> 
<style> 
.container { 
} 

</style> 
<div class="container"> 
    <div class="row"> 
    <div class="text-center"> 
     <!-- Button trigger modal --> 
     <button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#mynewempresa"> 
     Nueva empresa 
     </button> 
    </div> 
    </div> 

    <br> 
    <br> 



    <table id="empresas" class="display"><!--el id empresas es de datatables referenciado en empresas.coffe y display class es una clase de datatables--> 
    <thead> 

    <tr><!--active es para sombrear la fila--> 
     <th>Clave</th> 
     <th>Empresa</th> 
     <th>Acción</th> 
     <th></th> 

    </tr> 
    </thead> 
    <tbody id="container_empresas"> 
     <%= render @empresas %><!--carga todos los empresas--> 
</tbody> 


</table> 
<!-- Modal create action --> 
<%= form_for(@empresa, remote: true, html: {class: "form-horizontal formulario-validado-create"}) do |f| %> <!--ajax remote: true--> 
    <div class="modal fade" id="mynewempresa" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> 
    <div class="modal-dialog" role="document"> 
     <div class="modal-content"> 
     <div class="modal-header"> 
      <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> 
      <h4 class="modal-title" id="myModalLabel">Agregar empresa</h4> 
     </div> 
     <div class="modal-body"> 

      <div id="flash_messages_placeholder" > 

      </div> 

      <div class="form-group"> 
      <%= f.label :IdEmpresa, "Clave:", class: "control-label col-md-2 " %> 
      <div class="col-md-3"> 
       <%= f.text_field :IdEmpresa, class: "form-control empresa_clave",autofocus: true, minlength: "1", required: "true" %> 
      </div> 
       <%= f.label :Empresa, "Empresa:", class: "control-label col-md-2" %> 
      <div class="col-md-5"> 
       <%= f.text_field :Empresa, class: "form-control empresa_empresa",minlength: "4", required: "true" %> 
      </div> 
      </div> 





     </div> 

     <div class="modal-footer"> 
      <button type="button" class="btn btn-default" data-dismiss="modal" id="mynewempresaclose">Cerrar</button> 
      <%= submit_tag "Crear", class: "btn btn-primary"%> 
     </div> 
     </div> 
    </div> 
    </div> 
<%end%> 
</div> 

我的控制器

class EmpresasController < ApplicationController 
    before_action :set_empresa, only: [:show, :edit, :update, :destroy] 
    before_action :authenticate_usuario! 


    # GET /empresas 
    # GET /empresas.json 
    def index 
    @empresas = Empresa.all 
    @empresa = Empresa.new 
    respond_to do |format| 
     format.html 
     format.csv { send_data @empresas.to_csv} 
     format.xls #{ send_data @empresas.to_csv(col_sep: "\t") } 
    end 
    end 

    def import 
    Empresa.import(params[:file]) 
    redirect_to empresas_path, notice: "Sucursales importadas." 
    end 

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

    # GET /empresas/new 
    def new 
    @empresa = Empresa.new 
    end 

    # GET /empresas/1/edit 
    def edit 
    end 

    # POST /empresas 
    # POST /empresas.json 
    def create 
    @empresa = Empresa.new(empresa_params) 
    format.js { render 'shared/error_messages_js'} 

    respond_to do |format| 
     if @empresa.save 
     format.html { redirect_to @empresa, notice: 'Empresa was successfully created.' } 
     format.json { render :show, status: :created, location: @empresa } 
     format.js {flash.now[:notice] = 'La Sucursal se ha creado de forma exitosa.'} #ajax 


     else 
     format.html { render :new } 
     format.json { render json: @empresa.errors, status: :unprocessable_entity } 
     format.js {flash.now[:alert] = 'Error al crear la sucursal.'} #ajax 


     end 
    end 
    end 

    # PATCH/PUT /empresas/1 
    # PATCH/PUT /empresas/1.json 



    def update 
    respond_to do |format| 
      ##use locals if multiple models 
     ##add model errors 
     flash.now[:error] = @empresa.errors.full_messages 
     ##flash.now[:error] = @model.errors.full_messages.to_sentence 

     if @empresa.update(empresa_params) 
     format.html { redirect_to @empresa, notice: 'Empresa was successfully updated.' } 
     format.json { render :show, status: :ok, location: @empresa } 
     format.js {flash.now[:notice] = 'La Sucursal se ha actualizado de forma exitosa.'} #ajax 


     else 
     format.html { render :edit } 
     format.json { render json: @empresa.errors, status: :unprocessable_entity } 
     format.js {flash.now[:alert] = 'Error al actualizar la sucursal.'} #ajax 


     end 
    end 
    end 

    # DELETE /empresas/1 
    # DELETE /empresas/1.json 
    def destroy 
    @empresa.destroy 
    respond_to do |format| 
     format.html { redirect_to empresas_url, notice: 'Empresa was successfully destroyed.' } 
     format.json { head :no_content } 
     format.js {flash.now[:notice] = 'La Sucursal se ha borrado de forma exitosa.'} #ajax 


    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_empresa 
     @empresa = Empresa.find(params[:idempresa]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def empresa_params 
     params.require(:empresa).permit(:IdEmpresa, :Empresa) 
    end 
end 

我的應用助手:

module ApplicationHelper 
    ###application_helper.rb 
    def flash_display 
     Rails.logger.info "show flash message ajax======== " 
    response = "" 
    flash.each do |name, msg| 
     msg=msg ###"<i class='fa fa-quote-left fa-border'></i>"+msg+"<i class='fa fa-quote-right fa-border'></i>"+"<button type='button' class='close' title='hide' data-dismiss='alert'><i class='fa-times-circle-o fa pull-right'></i></button>".html_safe 
     response = response + 
     content_tag(:div, msg, :id => "flash_#{name}",:class=>"alert alert-danger") do 
      "#{msg}".html_safe 
     end 
    end 
    flash.discard 
    response 
    end 
end 

##觀點/共享/ error_messages_js.erb

$('#flash_messages_placeholder').html("<%= escape_javascript raw(flash_display) %>"); 
+0

我認爲這會幫助你:http://stackoverflow.com/questions/23967390/rails-flash-notice-via-ajax#乾杯。 –

+0

請包括您的AJAX請求的代碼片段,如何渲染表單,控制器代碼等。如果您通過'create.js.erb'模板使用服務器渲染的JavaScript(SJR),那麼您絕對可以通過使用JavaScript更新DOM來在Flash或Inline頁面上顯示錯誤。 –

+0

是的,確實如此。 – makallio85

回答

0

是的,可能的。

首先,創建一個可用於在視圖上顯示Flash消息的幫助方法。

###application_helper.rb 
    def flash_display 
     Rails.logger.info "show flash message ajax======== " 
     response = "" 
     flash.each do |name, msg| 
     msg=msg ###"<i class='fa fa-quote-left fa-border'></i>"+msg+"<i class='fa fa-quote-right fa-border'></i>"+"<button type='button' class='close' title='hide' data-dismiss='alert'><i class='fa-times-circle-o fa pull-right'></i></button>".html_safe 
     response = response + 
     content_tag(:div, msg, :id => "flash_#{name}",:class=>"alert alert-danger") do 
      "#{msg}".html_safe 
     end  
     end 
     flash.discard 
     response 
    end 

其次,在您使用remote=true發佈數據控制器代碼,處理JS響應,如下圖所示。

 respond_to do |format| 
      ##use locals if multiple models 
     ##add model errors 
     ##flash.now[:error] = @model.errors.full_messages 
     ##flash.now[:error] = @model.errors.full_messages.to_sentence 
     flash.now[:error]="You cannot edit this Page" 
     format.js { render 'shared/error_messages_js'} 
     end 

    ##views/shared/error_messages_js.erb 
     $('#flash_messages_placeholder').html("<%= escape_javascript raw(flash_display) %>"); 

因此,上述js.erb文件將尋找一個空的佔位符,以顯示閃存messages.So你的表格也必須有一個佔位符

###_form.html.erb 
    <form action="<%= post_data_path(current_user)%>" method="post" data-remote="true"> 
    <div id="flash_messages_placeholder" > </div> 

    ##input fields/submit button goes here 
    <%end%> 

希望它能幫助:)

+0

感謝您的回答,但仍無法正常工作,我更新了您的更改,請仔細閱讀 – LuisC

+0

我已更新我的控制器代碼以先設置閃存,然後呈現js file.check,並讓我知道:) – Milind

+0

與您的更改只顯示消息「您不能編輯此頁」,但不顯示錯誤時,我把重複的密鑰。文件「error_messages」是一個.js或_js? – LuisC