Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 链接到远程后的Rails ajax回调_Javascript_Ruby On Rails_Ajax - Fatal编程技术网

Javascript 链接到远程后的Rails ajax回调

Javascript 链接到远程后的Rails ajax回调,javascript,ruby-on-rails,ajax,Javascript,Ruby On Rails,Ajax,我正在尝试解决这个ajax回调业务,但没能成功。我已经看了很多问题、教程等,但我显然不明白这是怎么回事。我正在尝试更新包含分部的div的内容。这是一个标准的like/inspect类型函数,用户将单击链接,并应通过ajax更新图标。我的ajax远程请求工作正常,但我无法让回调正常工作。这是我的show.html.erb文件: <table class="v-table"> <tr> <td> <di

我正在尝试解决这个ajax回调业务,但没能成功。我已经看了很多问题、教程等,但我显然不明白这是怎么回事。我正在尝试更新包含分部的div的内容。这是一个标准的like/inspect类型函数,用户将单击链接,并应通过ajax更新图标。我的ajax远程请求工作正常,但我无法让回调正常工作。这是我的
show.html.erb
文件:

<table class="v-table">
    <tr>    
        <td>
            <div class="favorite">
                    <%= render 'vendors/favorite' %>
            </div>
        </td>
        <td><h2><%= image_tag @vendor.image_url %></h2></td>
        <td><%= @vendor.address %></td>
    </tr>
</table>
以下是我的相关控制器操作:

respond_to :js

def show

    @vendor = Vendor.find_by_id(params[:id])
end

def vote_for_vendor

    vendor = Vendor.find(params[:vendor_id])
    current_user.vote_for(vendor)
    render :toggle
end

def vote_against_vendor

    vendor = Vendor.find(params[:vendor_id])
    current_user.unvote_for(vendor)
    render :toggle
end
My toggle.js.erb文件:

$("#favorite").html("<%= escape_javascript render('favorite') %>");
$(“#收藏夹”).html(“”);
我对使用js和ajax真的很陌生,请帮助!提前谢谢

错误日志

正确提交远程事务后,出现以下错误:

Rendered vendors/_favorite.html.erb (1.3ms)
  Rendered vendors/toggle.js.erb (2.6ms)
Completed 500 Internal Server Error in 47ms

ActionView::Template::Error (Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id):
    1: <% if current_user.voted_for?(@vendor) %>
    2:  <%= link_to image_tag("Heart (2).png"), 
    3:      { :controller => :vendors, 
    4:      :action => 'vote_against_vendor', :vendor_id => @vendor.id},
  app/views/vendors/_favorite.html.erb:1:in `_app_views_vendors__favorite_html_erb___385976980778737159_2184308220'
  app/views/vendors/toggle.js.erb:1:in `_app_views_vendors_toggle_js_erb___3800164439665893406_2169792040'
  app/controllers/vendors_controller.rb:39:in `vote_for_vendor'


  Rendered /Users/User/.rvm/gems/ruby-2.0.0-p195/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.7ms)
  Rendered /Users/User/.rvm/gems/ruby-2.0.0-p195/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.3ms)
  Rendered /Users/User/.rvm/gems/ruby-2.0.0-p195/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (11.1ms)
Rendered vendors/_favorite.html.erb(1.3ms)
渲染供应商/toggle.js.erb(2.6ms)
在47毫秒内完成500个内部服务器错误
ActionView::Template::Error(称为nil的id,错误为4——如果您确实想要nil的id,请使用object\u id):
1: 
2:供应商,
4::action=>“投票反对供应商”,:vendor\u id=>@vendor.id},
app/views/vendors/\u favorite.html.erb:1:在“应用程序视图\u vendors\u favorite\u html\u erb\u 38597698077737159\u 2184308220”中
app/views/vendors/toggle.js.erb:1:in`_app_views_vendors_toggle_js_erb_3800164439665893406_21697992040'
app/controllers/vendors\u controller.rb:39:in'vote\u for\u vendor'
Rendered/Users/User/.rvm/gems/ruby-2.0.0-p195/gems/actionpack-3.2.13/lib/action\u dispatch/middleware/templates/rescues//u trace.erb(1.7ms)
Rendered/Users/User/.rvm/gems/ruby-2.0.0-p195/gems/actionpack-3.2.13/lib/action\u dispatch/middleware/templates/rescues//u request\u and\u response.erb(1.3ms)
rescues/layout中呈现的/Users/User/.rvm/gems/ruby-2.0.0-p195/gems/actionpack-3.2.13/lib/action\u dispatch/middleware/templates/rescues/template\u error.erb(11.1ms)

不确定这意味着什么:
ActionView::Template::Error(称为nil的id,错误为4——如果您真的想要nil的id,请使用object\u id):

Ajax是客户端发送服务器请求并通过多个命令获得响应的方法。 您应该在客户端进行调用(因此主要使用javascript或客户端语言编写代码)

不要忘记ajax在默认情况下是异步的(您可以更改它-第一次尝试时不建议这样做。实际上,当您将请求发送到服务器时,您会转到代码的下一行,并且响应不会完全在预期的时间收到,就像通常的程序一样)

这是一个微小的代码:

var tout;
....

function checkAjax() {
    'use strict';

    var xmlhttp;

    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    } else {// code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
            if (tout) {
                clearTimeout(tout);
            }
// do something
        }
    };

    function ajaxTimeout() {
        xmlhttp.abort();
// write error to client
    }

    clearTimeout(tout); // if tout is global.

    tout = setTimeout(function () {
        ajaxTimeout();
    }, 10000); // 10 seconds, or what you persume to be fine.

    xmlhttp.open("POST", "test.php", true); // it can be "GET" or aspx, or whatever.
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    xmlhttp.send("");
}

祝你好运

不确定,但我猜您的toggle.js.erb文件中可能缺少渲染“vendors/favorite”的。其他的一切对我来说似乎都很好

好的,您需要将模型分配给控制器中的
实例
而不是
本地
变量

@vendor = Vendor.find(params[:vendor_id])

其余的看起来不错。

错误日志怎么说?嗯。。。说得好。它说,
缺少模板供应商/投票给供应商
。我想我说过要
render:toggle
。愚蠢的问题(我的),但请求的类型是什么?它是否被解释为
JS
?请尝试
渲染操作:“toogle”
查看添加的
渲染操作:“toggle”
。发布更新的error.Toggle.js.erb应该更新div
#favorite
,这会使
(最爱的
部分化,否?是的,可能需要使用render partial::toggelYep,就是这样。我最初试图以这种方式设置我的两个投票方法,但不断出现错误,因此使用局部变量。不管出于什么原因,这次没有错误。谢谢
@vendor = Vendor.find(params[:vendor_id])