我在构建应用程序时自学编程和自学Rails。
我有一个包含作业列表的页面。每个作业都通过一个作业部分呈现,该部分具有一个div,通过"更新状态"带ajax的按钮。 该按钮按预期工作,并在单击时刷新每个作业的状态。
我现在尝试每隔x秒使状态div自动刷新一次。 在尝试了不同的方法之后,我实现了一个javascript,只需定期刷新按钮(如果需要,我可以稍后隐藏)。这是由@ de_an777:Rails 3 - Periodic Refresh of DIV建议的。
这似乎对我有用。 问题是它没有刷新列表中的所有作业。因此,如果列表中有2个作业,我会在服务器日志中看到两个刷新操作,但它们都只刷新第一个作业。 检查浏览器检查器中每个按钮元素的作业ID时,它们似乎都通过作业[:id]具有正确的ID。
我几天来一直在努力改变我的路线和方法,但却无法使其发挥作用。希望有人能以正确的方式指导我...
Jobs_controller.rb:
def update
@job = Job.find(params[:id])
#some updating logic
respond_to do |format|
format.js
end
end
index.html.erb:
<div class="row">
<aside class="col-md-4">
<section class="user_info">
<h1>Job List</h1>
</section>
<section class="job_form">
<%= link_to "New Job", upload_path, class: "btn btn-lg btn-primary" %>
</section>
</aside>
</div>
<%= render @jobs %>
_job.html.rb:
<span class="jobs">
<p> Job ID: <%= job.id %></p>
<p> Job Name: <%= job.name != "" ? job.name : "Untitled" %>
<p> Source File: <%= job.source_file %></p>
<% @job = job %>
<div id="status_div_<%= @job.id %>">
<%= render :partial => 'jobs/status', locals: {job: job} %>
</div>
<%= button_to("Update Status", jobs_update_path(id: job.id), remote: true, method: :patch, id: "refresh_#{job[:id]}") %>
</span>
</li>
<script type="text/javascript">
function doSomething() {
$('#refresh_<%= job[:id] %>').click();
}
setInterval('doSomething()',10000);
</script>
路线:
get 'new_job' => 'jobs#new'
get 'upload' => 'jobs#upload'
patch "jobs/update", to: "jobs#update"
resources :jobs
update.js.erb:
$('#status_div_<%= @job.id %>').html("<%= j render :partial => 'status', object: @job, as: :job %>");
_status.html.erb:
<p> Status: <%= job[:status] %></p>