【问题标题】:update div with ajax onclick rails using xmlhttprequest使用 xmlhttprequest 使用 ajax onclick rails 更新 div
【发布时间】:2014-01-25 09:33:24
【问题描述】:

我将行为用作可投票的 gem,并在 cmets 中实现了投票系统。现在我希望页面在用户单击 upvote 或 downvote 链接并更新投票计数器时停止重新加载。我想用这个

<script>
function loadXMLDoc()
{
  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)
    {
      document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  }
  xmlhttp.open("GET","URL_HERE",true);
  xmlhttp.send();
}
</script>

我的_comment.html.erb

<%= div_for comment do %>
    <p>
            <div style="float: left; text-align: center; margin-right: 20px;" class="comment">
                <% if user_signed_in? %>
                    <% if current_user.voted_for? comment %>
                        <%= link_to image_tag("updis.png", {:style => 'width: 30px'}), like_post_comment_path(@post, comment), method: :put, :disabled => 'disabled' %><br />
                        <% if comment.likes.size > comment.dislikes.size %> 
                            +<%= comment.likes.size-comment.dislikes.size %><br />
                        <% elsif comment.likes.size < comment.dislikes.size %>
                            <%= comment.likes.size-comment.dislikes.size %><br />
                        <% else %>
                            <%= comment.likes.size-comment.dislikes.size %><br />
                        <% end %>
                        <%= link_to image_tag("downdis.png", {:style => 'width: 30px'}), dislike_post_comment_path(@post, comment), method: :put, :disabled => 'disabled' %>
                    <% else %>
                        <%= link_to image_tag("upvote.png", {:style => 'width: 30px'}), like_post_comment_path(@post, comment), method: :put %><br />
                        <% if comment.likes.size > comment.dislikes.size %> 
                            +<%= comment.likes.size-comment.dislikes.size %><br />
                        <% elsif comment.likes.size < comment.dislikes.size %>
                            <%= comment.likes.size-comment.dislikes.size %><br />
                        <% else %>
                            <%= comment.likes.size-comment.dislikes.size %><br />
                        <% end %>
                        <%= link_to image_tag("downvote.png", {:style => 'width: 30px'}), dislike_post_comment_path(@post, comment), method: :put %>
                    <% end %>
                <% else %>
                    <%= link_to image_tag("updis.png", {:style => 'width: 30px'}), like_post_comment_path(@post, comment), method: :put, :disabled => 'disabled' %><br />
                    <% if comment.likes.size > comment.dislikes.size %> 
                        +<%= comment.likes.size-comment.dislikes.size %><br />
                    <% elsif comment.likes.size < comment.dislikes.size || comment.votes.size == 0 %>
                        <%= comment.likes.size-comment.dislikes.size %><br />
                    <% else %>
                        <%= comment.likes.size-comment.dislikes.size %><br />
                    <% end %>
                    <%= link_to image_tag("downdis.png", {:style => 'width: 30px'}), dislike_post_comment_path(@post, comment), method: :put, :disabled => 'disabled' %>
                <% end %>
            </div>
            <div style="float: left; margin-right: 20px;">
                <%= image_tag avatar_url(comment.user), class: 'profile-picture' %>
            </div>
            <strong>
                    <%= time_ago_in_words(comment.created_at).capitalize %> আগে <%= link_to comment.user.name, comment.user %> বলেছেন,
            </strong>
            <p>
                <%= comment.body %><br/><br />
            </p>
    </p>
    <hr />
<% end %>

我不知道应该在这一行中使用什么 URL

xmlhttp.open("GET","URL_HERE",true);

谁能告诉我怎么做。

【问题讨论】:

  • 你必须使用 XHR 还是可以使用 jQuery ($.ajax) ?
  • 任何对我有用的东西...我什至使用 railscasts 视频的机架 pjax...但无法使其工作
  • 好的,谢谢 - 让我在几分钟后写答案
  • 不使用 Rails 的内置 ajax 工具有什么特殊原因吗? edgeguides.rubyonrails.org/…
  • @scaryguy 你能告诉我我必须用什么来代替 appendTo 来简单地更新 cmets div 并更新投票数吗? appendTo 在旧评论下添加相同的评论并更新投票......两者同时存在......

标签: javascript ruby-on-rails ajax


【解决方案1】:

您对xhr 的使用可以通过更简单的$.ajax 或内置rails unobtrusive ajax 的实现来轻松简化:

我将解释如何使用标准 $.ajax 获得你想要的东西(将展示它是如何工作的):


$.ajax

#app/assets/javascripts/application.js
$("#vote_button").on("click", function() {

    $.ajax({
        url: "your/vote/url",
        data: {data: "info"},
        success: function(data) { alert(data) }
        error: function(data) { alert(data) }
    });

});

要直接回答您的问题,您使用的url 必须发送到触发投票操作的控制器方法

我对这个特定的 gem 没有任何经验,但我会详细说明如何手动创建此功能以提供一个想法:


路线

#config/routes.rb
resources :pictures do 
    get :vote_up
    get :vote_down
end

控制器

#app/controllers/pictures_controller.rb
def vote_up
    @picture = Picture.find(params[:id])
    #create "up" vote here

    respond_to do |format|
        format.js #loads vote_up.js.erb
    end
end

def vote_down
    @picture = Picture.find(params[:id])
    #create "down" vote here

    respond_to do |format|
        format.js #loads vote_down.js.erb
    end
end

分区

您可以通过在.js.erb 文件或ajax success 函数中部署代码来更新您呈现的DIV

【讨论】:

  • 在这 1 小时内,我在这个问题上取得了一些进展......你提到的部分已经实现......我现在坚持的是我创建了两个文件'upvote .js.erb' 和 'downvote.js.erb' 我正在使用 '$('#comment').replacewith(' @comment) %>');'在他们中。它不工作。如果我使用追加,它只是在旧评论下方添加更新的评论......你能告诉我用什么代替追加或替换吗?
  • 准确来说尝试遵循this的更新方法。他们使用了注释 div 所必需的 append。但是用什么代替 append 来简单地刷新或更新完整的 div 呢? replacewith 或 html 没有给出预期的结果
  • 好的,我建议使用.html(在标准JS中使用innerHTML函数)。您能解释一下您从 .html 命令看到的“意外结果”吗?
  • 我已经问过一个问题。这是链接stackoverflow.com/questions/21364900/…
猜你喜欢
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多