如何使用Ajax替换视图中的div标签

时间:2015-08-31 03:06:25

标签: ruby-on-rails

我想使用Ajax替换Images索引页面上的div标签。现在,我有以下内容:

_sub.html.erb

<% @group.images.each do |image| %>
      <%= image_tag image.pic.url(:medium) %>
      <%= button_to '+1', image_upvote_path(image), remote: true, method: :post %>
<% end %>

index.html.erb

<div id="next_group">
    <%= render 'sub' %>
</div>

upvote.js.erb

$("#next_group").empty();
$("#next_group").append("<%= j render 'sub' %>");

在我的images_controller中

def index
    @group = Group.offset(rand(Group.count)).first
end

def upvote
    @image = Image.find(params[:image_id])
    @image.votes.create

    respond_to do |format|
        format.html { redirect_to groups_path  }
        format.js
    end
end

在我的路线中,我有

image_upvote POST   /images/:image_id/upvote(.:format) images#upvote

我对正在发生的事情的理解:

在我的索引页面上,我有一个div容器,它呈现我希望用户看到的子部分。在sub partial中,我有一个button_to帮助器,其中包含remote: true属性(?)以及单击该按钮将启动的路径/操作。行动是images#upvote。所以在图像控制器中,我定义了单击按钮时我想要发生什么(创建了一个upvote),但我也说我希望它用Ajax响应,这是因为我已经声明了remote: true

这是我开始有点困惑的地方。由于正在使用Ajax,rails会自动查找upvote.js.erb文件,因为它是正在发生的upvote操作吗?

我的问题现在是投票正在创建,但我不认为upvote.js.erb中的javascript正在执行。该页面将保留在正在显示的当前@group上,而不会呈现新的_sub部分。所以我想我不确定javascript是否存在问题,或者可能是我设置控制器,视图和路由的方式。

1 个答案:

答案 0 :(得分:0)

也许按钮不属于任何形式,请尝试使用link_to或在路径中添加remote选项