通过AJAX渲染部分

时间:2012-11-17 03:44:07

标签: ruby-on-rails ruby-on-rails-3

描述

我有下一个工作代码。

  • 查看链接列表:

    <%= div_for feed do %>
      <%= link_to feed.name, { :controller => 'Feeds', :action => "get_posts", :id => feed.id }, 
    :remote => true %>  
    <% end %>
    
  • 当用户点击链接时,控制器可以正常工作:

    def get_posts
      @result = Feed.find(params[:id]).generate_html_table    
    
      respond_to do | format |  
        format.js {render :layout => false}  
      end
    end
    
  • 生成HTML的方法:

    def generate_html_table
        r = "<table>"
    
        self.posts.order("published desc").each { |p|                   
            link = '<a href=' + p.link + '>' + p.title + '</a>'
            date = '  ' + p.published.to_s
    
            r += '<tr><td>' + link + '</td><td>' + date + '</td></tr>'
        }    
    
        r + '</table>'
    end
    
  • get_posts.js.erb:

    $( "#in" ).html("<%= raw @result %>");
    

用户点击链接,generate_html_table genetares插入#id div的HTML代码。

问题

我想用partials更改generate_html_table。我怎么能得到它?

我是如何尝试的?

  • 我创建了文件视图/ feeds / _posts.html.erb,其中包含:

    some static text
    
  • 我将我的get_posts.js.erb编辑为:

    $( "#in" ).html("<%= escape_javascript(render :partial => 'posts' )%>");
    

但即使是现在,使用静态文本也无效。

2 个答案:

答案 0 :(得分:0)

看起来您在控制器中有视图代码,您应该摆脱generate_html_table方法并将其留给get_posts.js.erb,当您放置属于视图的代码时知道你要离开了。

问题第二部分中的get_posts.js.erb似乎是正确的,我在前一个视图代码中没有看到#in将插入代码,您是否检查过调用ajax URL直接丢弃ajax部分的问题? (就像没有加载jquery-ujs或者你正在使用的任何不显眼的javascript平台)。我也没有看到任何处理remote的代码,因此可能没有使用从调用返回的javascript。

我的建议是:

  • 摆脱generate_html_table
  • 将您要收集的帖子(self.posts.order("published desc"))收集到控制器中,该控件属于控制器
  • 将代码添加到您网页的资源,以处理按钮的ajax:success回调,以便在#in
  • 中插入html
  • 不要在你的ajax调用中返回javascript,而是返回你需要插入的HTML,让客户端处理javascript部分

答案 1 :(得分:0)

您可以尝试使用更多js模板

这里的问题是你混合了很多责任,试着把它们分开一点。

实施例

控制器:

您可以将order移动到模型中的范围内。

def get_posts
  @posts = Feed.find(params[:id]).order("published desc")

  respond_to do | format |  
    format.js 
  end
end

型号:

  • 该模型无需知道如何呈现帖子列表。
  • 提取generate_html_table方法。

查看:

在视图模板中实施旧的generate_html_table

<div id="in">
  <table>
  <% @posts.each do |p|  %>
    <tr> 
      <td> <%= j (link_to p.title, p.link) %> </td>
      <td><%= j p.published.to_s %> </td>
    </tr>
  <% end %>                
  </table>
</div>

注意:Haven没有测试这段代码,但是这样的事情应该可行。