试图找出 Ruby on Rails 远程:真正的回调

Posted

技术标签:

【中文标题】试图找出 Ruby on Rails 远程:真正的回调【英文标题】:Trying to figure out Ruby on Rails remote: true callbacks 【发布时间】:2013-03-01 23:10:43 【问题描述】:

所以我一直在谷歌上搜索如何设置它们,最后我得到了这段代码。

<script>

$('#reportform')
    .bind("ajax:success", function(data, status, xhr) 
        $('#reportalert').text('Done.');
    );
    .bind("ajax:error", function(xhr, status, error) 

        $('#reportalert').text('Failed.');

    );

</script>


<h2>Review Driver</h2>
<p>Fill out your review of the driver</p>   

<div class="hero-unit form-signin" id="reportformdiv">

    <%= form_for(@report, html:  id: "reportform" , remote: true, update: 
     success: "response", failure: "error" ) do |t| %>
<p id="reportalert"></p>
    <%= t.text_field  :plant_site,    placeholder: "Plant Site" %>

    <%= t.text_field  :route_number,  placeholder: "Route Number" %>

    <%= t.text_field  :driver_name,   placeholder: "Driver name if available" %>

    <%= t.date_select :date_recorded, html:  class: "input-block-level"  %>

    <%= t.text_field  :action,        placeholder: "Action taken" %>

    <%= t.text_area   :report_body,   placeholder: "What you witnessed",
                                     style: "height: 300px;",
                                     class: "input-block-level" %>

    <%= t.submit     "File Report",  class: "btn btn-primary btn-large" %>

    <% end %>

</div>

但它不起作用,我不知道为什么,我确定我做错了什么,我是 RoR 的新手,我喜欢这样一个事实,我可以声明这个遥控器:以其自身的形式为真,一旦我弄清楚如何设置回调,我会很高兴:)提前谢谢。

【问题讨论】:

当您尝试提交表单时,浏览器的日志控制台会告诉您什么? (可在谷歌浏览器中按 F12 访问) @MrYoshiji 没什么,控制台报告。什么都没有。 你想这样工作??我有使用jquery 而不是使用:remote =&gt; true 的解决方案。我很确定它会像魅力一样发挥作用。没事吧?? 【参考方案1】:

根据Rails' wiki,下面的代码应该可以工作:

<script>
  $(document).ready(function()
    $('#reportform').on('ajax:success', function(e, data, status, xhr)
      $('#reportalert').text('Done.');
    ).on('ajax:error',function(e, xhr, status, error)
      $('#reportalert').text('Failed.');
    );
  );
</script>

类似的代码在 Rails 3.2.14 和 jquery-rails 3.0.4 中为我工作

希望对你有帮助。

【讨论】:

如果有人想知道如何获取实际的错误消息,响应正文显然包含在 e.detail 中。 如果表单的目标是“_blank”并且服务器的响应是下载 PDF,这些事件是否仍会触发?我的初步测试表明没有反应。当文件从服务器返回给客户端时,无论如何要捕捉这种情况?或者一种从服务器触发客户端调用javascript函数的方法,同时返回没有双重渲染问题的pdf? 如果您添加一个ajax:success 处理程序但它似乎不起作用,则问题可能是 Ajax 请求失败 - 即使它是 200 响应也会发生这种情况,例如如果您不返回 JSON。您可以通过添加ajax:error 处理程序来验证,如上例所示。【参考方案2】:

从 Rails 5.1 开始,必须通过 event.detail 提取 response、status 和 xhr 参见:https://edgeguides.rubyonrails.org/working_with_javascript_in_rails.html#rails-ujs-event-handlers

这是一种可能的解决方案:

$(document).on('ajax:success', '#reportform', event => 
  const [response, status, xhr] = event.detail;
);

【讨论】:

感谢您的提醒!现在稳定了:[guides.rubyonrails.org/working_with_javascript_in_rails.html]【参考方案3】:

Turbolinks 兼容

<script type="text/javascript">

    $(document).on('ajax:success', 'a[data-remote].watching', function(e, data, status, xhr)

    );

</script>

【讨论】:

【参考方案4】:

试试这个:

把你的javascript代码放在document ready:

<script>
$(document).ready(function()
  $('#reportform')
    .bind("ajax:success", function(data, status, xhr) 
        $('#reportalert').text('Done.');
    );
    .bind("ajax:error", function(xhr, status, error) 

        $('#reportalert').text('Failed.');

    );
)
</script>

【讨论】:

【参考方案5】:

您不必使用 jQuery。可以这样做:

document.querySelector('#reportform')
    .addEventListener("ajax:success", function(data, status, xhr) 
        document.querySelector('#reportform').text('Done.');
    );
    .addEventListener("ajax:error", function(xhr, status, error) 
        document.querySelector('#reportform').text('Failed.');
    );

【讨论】:

以上是关于试图找出 Ruby on Rails 远程:真正的回调的主要内容,如果未能解决你的问题,请参考以下文章

ruby on rails 中的 Coffeescript 编译错误

ruby on rails(基础)

如何从 ruby​​ on rails 上的现有远程 oracle 数据库中获取数据

Wordpress可以被像Django或Ruby on Rails这样的框架取代吗?

Errno::ENOTTY 通过 SuSe 上的 Net::SSH 连接到远程服务器时设备的 ioctl 不合适(使用 Ruby on Rails 5.2.4)

第一个CRUD的制作方法(Ruby on Rails 開發秘籍 | Ruby on Rails 快速入門)