0

ユーザーがトリガーする (jquery クリック) ajax 呼び出しを作成して、余分なデータをロードして Web ページを埋めます。html を作成する正しい方法は何ですか: rails コントローラー内で html を生成し、html データを返すだけですか、それとも返す必要がありますか? JSONとajax関数で構築しますか? または、レールで ajax 呼び出しを行うためのより良い方法はありますか?

現時点での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
4

1 に答える 1

0

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

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

おまけの答えとして、ヘルパー内で多くの複雑な HTML コードを自己構築している場合は、特に C/C++ のバックグラウンドを持っている場合は、Builder::XmlMarkup を確認することをお勧めします。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
于 2012-04-22T20:33:07.017 に答える