在Rails 3中通过.ajax渲染静态局部视图

3

我有两个关注/取消关注表单在我的Rails代码中。它们长这样:

<%= form_tag( {:controller => 'profile', :action => 'unfollow_topic' }) do %>
  <%= hidden_field_tag :topic_id, @topic.id %>
  <button class="question_button" type="submit">Unfollow</button>
<% end %>

并且这个:

<%= form_tag({:controller => 'profile', :action => 'follow_topic' }) do %>
 <%= hidden_field_tag :topic_id, @topic.id %>
 <button class="question_button" type="submit">Follow</button>
<% end %>

然后我有这段JavaScript代码:

<script type="text/javascript">
  $(function(){
    $('#follow form').submit(function(e) {
      $.ajax({
        url: this.action,
        type: 'POST',
        data: $(this).serialize(),
        success: function(response){ $('#follow').html(response); }
      });
    return false;
    });
  });   
</script>

我的问题是如何从控制器中返回适当的“关注/取消关注”局部视图,以便可以用返回的响应替换它。
我目前有以下代码,但似乎不起作用:
  respond_to do |format|
    format.html { redirect_to('/' + topic.type + '/' + topic.uri) }
    format.js   { render :partial => 'unfollow_topic' }
  end

但是,如果它渲染整个页面,我相信它实际上是响应于 format.html 而不是 format.js。你有什么想法吗?


你的 '_unfollow_topic.js.erb' 文件里有什么内容?你尝试过将其中所有内容清空,只放入一些警告的 JavaScript 代码吗?alert("Hello!");这样做可能会告诉你是否成功获取了你的部分文件。 - ipd
Ajax请求通常用于更新页面的某个部分。从您的问题中我所理解的是,您想通过Ajax请求来更新整个页面,这正确吗? - Bohdan
还请在此请求中发布您的日志块。抱歉,我无法提供日志块,因为这是一条新的请求。以下是翻译的文本:也请只返回翻译后的文本。 - Bohdan
@ipd 是的,我尝试在成功语句上放置一个警报,并且确实收到了响应。而且,我没有一个_unfllow_topic.js.erb文件,我应该有它吗?难道RJS不是在rails 3中被弃用了吗? - Gotjosh
它将寻找该部分,尝试创建该部分并将警报放置在其中,然后查看结果。 - ipd
1个回答

5

JavaScript:

  <script type="text/javascript">
      $(function(){
        $('#follow form').submit(function(e) {
          $.ajax({
            url: this.action,
            type: 'POST',
            data: $(this).serialize(),
            dataType: 'html'
            success: function(response){ $('#follow').html(response); }
          });
        return false;
        });
      });   
    </script>

控制器:


respond_to do |format|
    format.html  do
      if request.xhr?
        render :partial => 'unfollow_topic'
      else
        redirect_to('/' + topic.type + '/' + topic.uri)
      end
    end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接