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.erb2 番目の部分は正しいようです#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 に答える