Ruby on rails 在rails中使用ajax作为可编程对象
我试图在acts_as_votable gem上使用ajax,这样页面就不会在投票/升级投票时刷新。我已经为此调整了控制器方法,并在链接上添加了remote true。然而,我认为剩下的只有两个.js.erb文件。我看了一下这里和ruby文档,似乎找不到如何处理这个实例。谢谢 未定义未捕获引用错误:Ruby on rails 在rails中使用ajax作为可编程对象,ruby-on-rails,ruby,ajax,Ruby On Rails,Ruby,Ajax,我试图在acts_as_votable gem上使用ajax,这样页面就不会在投票/升级投票时刷新。我已经为此调整了控制器方法,并在链接上添加了remote true。然而,我认为剩下的只有两个.js.erb文件。我看了一下这里和ruby文档,似乎找不到如何处理这个实例。谢谢 未定义未捕获引用错误:VM23182:1 时间:1:1 在处理响应时(应用程序-50000f29e1bf2752ae7e56dda39f10dd0f67a47aea5c3f07ed0d933f3e1a256a.js:26
VM23182:1
时间:1:1
在处理响应时(应用程序-50000f29e1bf2752ae7e56dda39f10dd0f67a47aea5c3f07ed0d933f3e1a256a.js:268)
在应用程序-50000f29e1bf2752ae7e56dda39f10dd0f67a47aea5c3f07ed0d933f3e1a256a中。js:196
在XMLHttpRequest.xhr.onreadystatechange(应用程序-50000f29e1bf2752ae7e56dda39f10dd0f67a47aea5c3f07ed0d933f3e1a256a.js:251)
看起来您最初启动的方式是将处理程序附加到侦听成功请求的按钮上。这是一种公平的方法,但是——既然您已经在使用Rails UJS——有一种可能“更好”的方法
使用Rails UJS,从远程操作返回的JS文件将自动执行。在我看来,Rails更惯用的方法是:
将图标提取到其自己的模板中:
<div id="tweets">
<% @tweets.each do |tweet| %>
<div id="tweet-<%= tweet.id %>" class="card">
<h4 class = "username"><%= link_to tweet.user.username, user_path(tweet.user) %></h4>
<p class="tweet-content"><%= tweet.content %></p>
<p class="date"><%= tweet.created_at.strftime("%B %d %Y, %l:%M%P") %></p>
<%= render 'icons', tweet: tweet %>
</div>
<% end %>
</div>
然后,在upvote/downvote控制器操作中,您将format.js{render'vote'}
它将位于tweets/vote.js.erb
上,看起来像:
document.querySelector('#tweet-<%= @tweet.id %> .icons').outerHTML = '<%= j render('icons', tweet: @tweet) %>';
你已经为js文件做了哪些尝试?我试图把别人的代码改成我的,但我不知道如何诚实。我将把它添加到我的问题中。我对ajax还很陌生。@chrishall只是为了鼓励其他答案,您可能希望将JS代码片段放在开头的段落之后。谢谢。然而,我遵循了这些步骤,当我点击upvote/downvote按钮时,我仍然需要刷新页面,以了解数字上升的效果。你确定JS能够瞄准卡吗?您可能需要手动运行一些代码或观察网络请求,以了解发生了什么。大多数浏览器都有某种形式的JS控制台/网络监视器。老实说,我不太确定,但是当我在最初的问题中单击终端和控制台上的upvote按钮时,我已经上传了日志,如果有帮助的话。啊,对了,我忘了Rails不再与jQuery捆绑在一起了。让我来解决这个问题。
document.querySelector('#tweet-<%= @tweet.id %> .icons').outerHTML = '<%= j render('icons', tweet: @tweet) %>';
$('#tweet-<%= @tweet.id %> .icons').replaceWith('<%= j render('icons', tweet: @tweet) %>');