2014-03-24 24 views
0

我有以下代碼:導軌和JSON響應顯示閃爍在阿賈克斯

我jobs.html.erb

<div class="alert alert-error" style="display: none;"></div> 
    <p><%= link_to t("jobs.index.buttons.similar_functions"), user_email_settings_path, :class => "nice medium blue button", :id => "saveAgent" %> <small id="agent-saved" style="font-size: 1em !important;display: none;"><%= t("jobs.index.saved_agent") %></small><br /></p> 

在該頁面,我有以下腳本:

$("#saveAgent").on('click', function (event) { 
    event.preventDefault(); 
    $("#saveAgent").addClass("disabled"); 
    if($("#saveAgent").hasClass("disabled")) { 
      $.ajax({ 
      type: 'POST', 
      url: $(this).attr("href"), 
      data: $("form").serialize(), 
      complete: function() { 
       $("#agent-saved").show(1).delay(20000).fadeOut(800); 
       $("#saveAgent").removeClass("disabled"); 
       alert("<%= flash[:error] %>"); 
       $('div.alert').show(); 
       $('div.alert').text("<%= flash[:error] %>");  
      } 
      }); 
    } 
    }); 

link_to轉到我的電子郵件settings_controller.rb誰有以下代碼:

def create 
    api_params = params[:criteria] 
    api_params = params[:criteria].reject{|k,v| v.to_s.blank?} 

    @j = JobAgent.new(name_for_job_agent(current_user), true, api_params) 
    result = Sap.submit_job_agent(@j.name, @j.to_xml, api_params_for_user) 

    parser = MessageParser.new(result.body["RESULT"]) 
    parser.messages.each do |message| 
     if message.type = "E" 
     flash[:error] = "test" 
     respond_to do |format| 
      format.json { render :json => flash} 
     end 
     end 
    end 
    end 

現在,因爲它是ajax,我無法以正常的方式渲染閃爍,並且必須通過JSON傳遞某些內容。我的代碼似乎有50%的時間有效,有時他返回正確的「測試」,有時他什麼都沒有返回。

這是這樣做的正確方法嗎?我怎樣才能讓它工作100%。

謝謝!

編輯1:

我想下面,發現這裏:How to send simple json response in Rails?

def testme 
    respond_to do |format| 
    msg = { :status => "ok", :message => "Success!", :html => "<b>...</b>" } 
    format.json { render :json => msg } # don't do msg.to_json 
    end 
end 

但我怎麼在我的完整功能,閱讀味精?

回答

0

我已經固定它像這樣改變了我的控制器這樣的:

respond_to do |format| 
    format.json { render :json =>{ :message => "Hello world"} } 
    end 

而且改變了我的腳本:

$("#saveAgent").on('click', function (event) { 
    event.preventDefault(); 
    $("#saveAgent").addClass("disabled"); 
    if($("#saveAgent").hasClass("disabled")) { 
      $.ajax({ 
      type: 'POST', 
      url: $(this).attr("href"), 
      data: $("form").serialize(), 
      success: function(data) { 
       $("#agent-saved").show(1).delay(20000).fadeOut(800); 
       $("#saveAgent").removeClass("disabled"); 

       if (data.message != "") { 
       $('.alert.alert-error').show(); 
       $('.alert.alert-error').text(data.message); 
       } 
      } 
      }); 
    } 
    }); 
0

當您使用flash[:error] = '...'時,該消息將在下一個請求中消耗,因爲此語法通常在redirect_to之前使用。

你的情況,你馬上需要的信息,因爲您使用render,所以你應該使用:

flash.now[:error] = '...' 

看看它是如何工作的:http://guides.rubyonrails.org/action_controller_overview.html#the-flash

+0

親愛的主席先生,我已將其更改爲flash.now [:error] =「Hello world」並嘗試執行alert(「<%= flash.now [:error]%>」);和警報(「<%= flash [:error]%>」); flash.now.error都是空的 – Vinozio