0

描述

我有以下工作代码。

  • 查看链接列表:

      <%= 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 生成插入#id div 的HTML 代码。

问题

我想用部分更改 generate_html_table 。我怎么才能得到它?

我是如何尝试的

  • 我创建了文件views/feeds/_posts.html.erb:

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

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

但即使是现在,使用静态文本也行不通。

4

2 回答 2

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按钮的回调以插入 html#in
  • 不要在您的 ajax 调用中返回 javascript,而是返回您需要插入的 HTML,让客户端处理 javascript 部分
于 2012-11-17T04:14:58.107 回答
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>

注意:尚未测试此代码,但这样的东西应该可以工作。

于 2012-11-17T05:22:07.877 回答