2012-04-22 3 views
0

Webページを埋めるために余分なデータを読み込むためにユーザーがトリガーする(jquery click)ajax呼び出しを作成しています。レールコントローラ内でhtmlデータを返すか、JSONを返してajax関数でビルドする必要がありますか?または、Ajaxコールをレールで行うための良い方法がいくつかありますか?ここでRails、ユーザーがトリガーしたajax呼び出しとhtml出力のオプション

は、現時点ではcountries.html.hamlコードは(HTMLデータがコントローラで生成された)である:

$('#tab li').click(function(){ 
    $('#tab li').removeClass('active'); 
    $(this).addClass('active'); 

    var first_l = $(this).attr("id") 

    $.ajax({ 
    url: "/countries/get_flags", 
    type: "GET", 
    data: {first_letter: first_l}, 
    complete: function() { 
     // called when complete 
    }, 
    success: function(data) { 
     // called when succesful 
     $('#countries_container').html(""); 
     $('#countries_container').append(data); 
    }, 
    error: function(xhr,status,error) { 
     // called when error 
    } 
    }); 
}); 

とコントローラ:

def get_flags 

    @html = "" 
    @fetched_countries = Country.all(:conditions => "name like '#{params[:first_letter]}%'") 
    i = 1 
    @html = "<div class='row country-row'>" 
    @fetched_countries.each do |country| 
    if i % 5 == 0 
     @html += "<div class='row country-row'>" 
     i = 1 
    end 

    @html += "<div class='span3 '>" 
    @html += "<div class='country-name'>#{country.name}</div>" 
    @html += "<div class='country-image thumbnail'><img alt='#{country.id.to_s}' src='/assets/countries/x100/#{country.id.to_s}.png' /></div></div>" 
    if i % 4 == 0 
     @html += "</div>" 
    end 
    i = i + 1 

    end 
    render :text => @html 

end 

答えて

0

まず、置くための最も自然な場所複雑なHTML生成コードはヘルパーにあります。通常、ヘルパーはビューコード内から利用されます。それらはヘルパーメソッドによってビューコードに含まれます。しかし、コントローラでHTMLコードを生成する必要がある場合は、ヘルパーコードを使用してHTMLをコントローラからブラウザに戻すことができます。

質問に直接答えるには、ブラウザでJavaScriptを使用してビルドするのではなく、コントローラでHTMLを生成することをお勧めします。 RailsとJavascriptを使用している場合、レールはブラウザのJavaScriptよりも堅牢な環境です。より包括的な環境で開発努力の多くを集中させるのが理にかなっています。

BONUSの回答として、ヘルパー内に複雑なHTMLコードがたくさんある場合は、Builder :: XmlMarkupを見てみてください.C/C++バックグラウンドから来た場合は、特に注意してください。 Builder :: XmlMarkupでは、Cプログラマーにとって非常に直感的な方法でHTMLを作成することができます。 C/C++から来ていないとしても、Builder :: XmlMarkupは非常に読みやすいコードになります。例えば、

require 'active_support/builder' unless defined?(Builder) 

def an_html_generator_method(somestuff) 
    xm = Builder::XmlMarkup.new 
    xm.div(:class=>'mydiv') { 
    xm.ul(:id=>'aMenu') { 
     somestuff.each do |i| 
     xm.li { xm << i.whatever } 
     end 
    } 
    } 
end 
+0

このような素晴らしい答え!どうもありがとうございました!私は間違いなくそのクラスを調べます。 –

+0

さて、私は中止して「終了」声明を出し、回答を編集しました – RadBrad