2010-07-26 17 views
15

Seçme kutusunda bir değişiklik çağrısı yapmaya çalışıyorum. Uygulamam için UJS'yi kullanmak için belirtildiği gibi jquery.js ve rails.js kullanıyorum. Ama yine de üretilen kod prototip içindir ve jquery ajax çağrıları için değildir. Benim kod aşağıdaki gibi görünür:Ajax, remote_function kullanarak Rails 3 ile nasıl çağrılır?

<%= select_tag :category, 
     options_for_select(
      Category.find(:all,:select=>"name,id").collect{|c| [c.name,c.id]}), 
     :onchange => remote_function(:url => {:controller => "posts", 
              :action => "filter_post", 
              :filter =>"category"}, 
            :with=>"'category_id=' + $('#category').val()") %> 

kod bu tarafından oluşturulan geçerli: jQuery kullanıyorsanız raylar 3. hiçbir remote_function yoktur

new Ajax.Request('/posts/filter_posts?filter=category', {asynchronous:true, evalScripts:true, 
parameters:'category_id=' + $('#category').val() + '&authenticity_token=' + 
encodeURIComponent('CCyYj1wqXtddK6pUV6bAxw0CqZ4lbBxDGQHp13Y/jMY=')}) 

cevap

25

söyledi: Bu action_name yöntem arayacak

$(function($) { 
    $("#selector_for_element").change(function() { 
     $.ajax({url: '<%= url_for :action => 'action_name', :id => @model.id %>', 
     data: 'selected=' + this.value, 
     dataType: 'script'}) 
    }); 
}); 

: raylar 3.

çözüm öne çıkmayan gibi bir şey kullanarak onchange işleyicisi eklemektir hiçbir remote_function yoktur Geçerli denetleyicide, selected=... sonucunu parametre olarak geçirme. Şimdi javascript parçasını, örneğin kontrolördeki gibi bir şey kullanarak:

calculated = calculate_some_value_using(params[:selected]) 
render(:update) {|page| 
    page << "$('#selector_for_field_to_update).html(#{calculated})" 
} 

'u döndürebilirsiniz. '' Page '' öğesine eklediğiniz dize geçerli javascript olmalı ve $ .ajax kullanırsanız otomatik olarak çalıştırılacaktır. ,

<%= select_tag :category_id, 
    options_for_select(
     Category.find(:all,:select=>"name,id").collect{|c| [c.name,c.id]}), 
    :data => { :remote => true, :url => url_for(:controller => "posts", 
             :action => "filter_post", 
             :filter =>"category") } %> 

olsa adil olmak:

DÜZENLEME: Bilginize, son zamanlarda jquery-ujs bir seçme değişim yardımcı eklendi, böylece artık yerleşik jquery-ujs adaptörü kullanarak bu mütevazi şekilde yapabiliriz Seçtiğiniz bir değişiklik olayı eklemek, formunuz AJAX isteğinin sonucuna bağlı olmadıkça javascript devre dışı bırakılmış kullanıcılar için zarif bir geri dönüş olmadığından gerçekten "göze batıcı" olmayacaktır. için

+2

@jangosteve Teşekkür: size sonunda tüm remote_function refactor biraz zaman kazanabilirim Bu mütevazi jquery-ujs olay geri aramalar kullanmayı çağırır. Tam olarak aradığım şey. –

+0

@confusion: gerçekten yardımcı oldu, thanx – vishB

10

, şöyle bir şey yapabilirsiniz Bu: Aşağıdaki

$.ajax({ 
    type: 'POST', 
    url: 'http://your_url/blah', 
    data: 'param1=value1&params2=value2', 
    success: function(data){eval(data);} 
}); 
3

benim haml görünümünden basit jQuery snippet'tir

:javascript 

    $("#select_box_id").change(function() { 
     $.post('#{target_url}?param_one='+$(this).val()); 
    }); 

Bu yardımcı olur umarım. Teşekkür .. Sergei olarak

0

Ajax Çağrı parametreleri ile kontrol aksiyon: Eğer ben remote_function ağır kullanmıştır 3 raylar için büyük raylar app yükseltme vardı sorunu yaşadığınız takdirde

function combined_search() { 
    var countries = $('#countries').val(); 
    var albums = $('#albums').val(); 
    var artists = $('#artists').val(); 
    $.ajax({ 
     url:"<%=url_for :controller => 'music_on_demand',:action => 'combined_search' %>", 
     data:'country=' + encodeURIComponent(countries) + '&albums=' + encodeURIComponent(albums) + '&artists=' + encodeURIComponent(artists), 
     cache:false, 
     success:function (data) { 
     } 
    }) 
} 
1

, sınırlı geriye uyumluluk elde edebilirsiniz Diğer cevaplar tarafından önerilen biçimde jQuery kodu üreten bir application_helper yöntemi ekleyerek. Bu kodu kullanabildiğim gibi kullanabildim, bunun yerine yeni: başarı komut dosyası seçeneğini kullanmak için bir çağrı kodu parçasını güncellemeliydim: Burada desteklenmeyen güncelleştirme sağlama seçeneği. düzenlemek için

def remote_function(options) 
    ("$.ajax({url: '#{ url_for(options[:url]) }', type: '#{ options[:method] || 'GET' }', " + 
    "data: #{ options[:with] ? options[:with] + '&amp;' : '' } + " + 
    "'authenticity_token=' + encodeURIComponent('#{ form_authenticity_token }')" + 
    (options[:data_type] ? ", dataType: '" + options[:data_type] + "'" : "") + 
    (options[:success] ? ", success: function(response) {" + options[:success] + "}" : "") + 
    (options[:before] ? ", beforeSend: function(data) {" + options[:before] + "}" : "") + "});").html_safe 
end