【问题标题】:Rails Respond with JSON to show Flashes in AjaxRails 使用 JSON 响应以在 Ajax 中显示 Flash
【发布时间】:2014-03-24 15:01:35
【问题描述】:

我有以下代码:

我的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 转到我的 email-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,我不能以正常方式渲染我的 flash,我必须通过 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

但是如何在我的完整函数中读取 msg?

【问题讨论】:

    标签: jquery ruby-on-rails ajax json flash


    【解决方案1】:

    当你使用flash[:error] = '...'时,消息会在下一个请求中被消费,因为这个语法通常用在redirect_to之前。

    在您的情况下,您需要立即发送消息,因为您使用的是render,所以您应该使用:

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

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

    【讨论】:

    • 尊敬的先生,我已将其更改为 flash.now[:error] = "Hello world" 并尝试执行 alert("") ;和 alert("");两者都是空的同样适用于 flash.now.error
    【解决方案2】:

    我已经修复它,就像这样将我的控制器更改为:

      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);
                  }
                }
              });
        }
      });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-02
      • 2014-01-28
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多