【问题标题】:Trying to AJAXify this rails 4 method call and getting 500 error尝试 AJAXify 这个 rails 4 方法调用并得到 500 错误
【发布时间】:2014-01-01 00:58:16
【问题描述】:

我的视图中有一个表:views/uploads/index.html.erb

  other code

  <div id="uploads_table">
  <table   class="table table-striped">
  <thead>
   <tr>

    <th>File name</th>

        blah
        blah
        blah

    <th>Actions</th>
     </tr>
   </thead>
   <tbody >
     <%= render (@uploads) %> <%# partial _upload.html.erb %> 
   </tbody>

这里是部分'_upload.html.erb'

 <tr id= "uploads_table_rows">

    <td> <%= upload.sourcedata_file_name%></td>
         <% path_arr = upload.f_path.split("\/")%>


            blah
            blah
            blah

           <%end%>
       <td><%= render 'button', :upload => upload%></td>
 </tr>

我正在尝试在后台作业运行并且表中的值发生变化时更新此表。

为此,我有以下设置: 1) 在我的 upload_controller.rb 中,我有以下方法:

 before_action :set_upload, only: [:show, :edit, :update, :destroy]

   #refresh uploads table in uploads/index.html.erb
def refresh_table
    @uploads = Upload.all
    @uploads.each do |u|
        if(File.exist?(u.f_path))
            puts "File #{u.sourcedata_file_name} exists"
        else
            puts "File #{u.sourcedata_file_name} has been removed"
            u.update!(:status => "-1")
        end
    end
    @uploads = Upload.all
    respond_to do |format|
        format.js
    end
end 


 private
  # Use callbacks to share common setup or constraints between actions.
  def set_upload
   @upload = Upload.find(params[:upload][:id])
  end

 # Only allow a trusted parameter "white list" through.
 def upload_params
   params.require(:upload).permit(:id, :sourcedata, :task_id, :status, :f_path, :job)
end

2) 在我的 uploads.js.coffee 我添加了这段代码

 $(document).ready ->

   # will call refresh_table every 1 second
   setInterval refresh_table, 1000

 refresh_table = ->
   $.ajax url: "/uploads_controller/refresh_table"

3) 我使用以下代码添加了一个文件“refresh_table.js.erb”

  $('#uploads_table').html("#{escape_javascript(render 'upload', data:@uploads)}");

4) 最后我更新了我的路由文件,将这一行作为最后一行:

 get 'uploads_controller/refresh_table'

我重新启动了服务器并启动了更新表值的后台作业。我在 chrome 中运行了 javascript 控制台,我看到的只是每 1 秒这些行

 GET http://localhost:3000/uploads_controller/refresh_table 404 (Not Found) 
jquery.js?
body=1:8707

我不知道出了什么问题。我是 AJAX 新手,所以我想知道是否有人可以帮我解决这个问题。谢谢


更新: 在尝试了下面发布的解决方案后,这就是我的 routes.rb 的样子:

 blah 
 blah


resource :uploads do
    member do
        post "parse"
        get "refresh_table", to: "refresh_table"
    end
end


 blah
 blah

这是在我的 chrome 浏览器中看到的“网络”选项卡的图像:

控制台选项卡如下所示:

服务器控制台输出:

 Started GET "/uploads/refresh_table" for 127.0.0.1 at 2014-01-01 10:24:42 -0500
 Processing by UploadsController#show as */*
 Parameters: {"id"=>"refresh_table"}
 Completed 500  in 1ms

 NoMethodError - undefined method `[]' for nil:NilClass:
  app/controllers/uploads_controller.rb:89:in `set_upload'

网络预览标签:

预览标签:

【问题讨论】:

    标签: javascript ruby-on-rails ajax controller view-templates


    【解决方案1】:

    这是你的问题:

    $.ajax url: "/uploads_controller/refresh_table"
    
    -> GET http://localhost:3000/uploads_controller/refresh_table 404 (Not Found) 
    

    应该是:

    $.ajax url: "/uploads/refresh_table"
    

    你的路线应该是:

    resources :uploads do 
        get "refresh_table", to: "refresh_table"
    end
    

    Ajax

    Ajax 是这样工作的:

    User request -> JS -> Ajax -> Rails
    User view    <- JS <- Ajax <- Rails
    

    它基本上是一个“伪浏览器”

    它接受用户执行的操作/请求(单击链接,在视图中执行某些操作),然后您使用 Javascript 处理该请求

    Ajax 被称为Asynchronous Javascript And XML,因为它代表您发送请求。让大多数人感到困惑的是,Ajax 与 Rails 完全脱节,必须使用与“普通”浏览器相同的路由结构

    最好将其视为传送系统 - 您在客户端的请求通过 Ajax 传送到 Rails。但是,就像传送系统一样,您仍然需要知道坐标并有一个端点来连接

    【讨论】:

    • 谢谢。我对我的代码进行了更改并添加了您的建议。现在我在我的 Javascript 控制台中看到这个错误:( >>> "GET localhost:3000/uploads/refresh_table 500 (Internal Server Error) jquery.js?body=1:8707 send jquery.js?body=1:8707" jQuery.extend.ajax jquery.js?body=1:8137 refresh_table uploads.js?body=1:9
    • 这意味着您的后端(控制器操作)有问题 - 您可以进入浏览器控制台,选择“网络”选项卡并选择出现的红色请求吗?你能告诉我们上面说的吗?
    • 非常感谢您的帮助。请看上面的帖子。我已经用你寻求的信息更新了它。谢谢。
    • 哇很多错误!!你能到网络部分的preview 选项卡再拍一张截图吗?谢谢!
    • 是的,错误基本上是相同的错误,因为它每隔几秒运行一次 ajax 调用。我会在一分钟内发布预览选项卡的内容。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2017-05-17
    • 2018-10-14
    • 2010-11-21
    相关资源
    最近更新 更多