Как сказал Сергей: в рельсах нет функции remote_function 3.
Решение состоит в том, чтобы незаметно добавить обработчик onchange, используя что-то вроде:
$(function($) {
$("#selector_for_element").change(function() {
$.ajax({url: '<%= url_for :action => 'action_name', :id => @model.id %>',
data: 'selected=' + this.value,
dataType: 'script'})
});
});
Это вызовет метод action_name
в текущем контроллере, передавая результат selected=...
в качестве параметра. Теперь вы можете вернуть кусок JavaScript, например, используя что-то вроде:
calculated = calculate_some_value_using(params[:selected])
render(:update) {|page|
page << "$('#selector_for_field_to_update).html(#{calculated})"
}
в контроллере. Строка, которую вы добавляете к странице, должна быть действительным javascript и будет выполнена автоматически, если вы используете $ .ajax.
РЕДАКТИРОВАТЬ: К вашему сведению, недавно мы добавили помощник по изменению выбора в jquery-ujs, поэтому вы можете сделать это незаметным способом, используя встроенный адаптер jquery-ujs:
<%= 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") } %>
Хотя, честно говоря, добавление события select change на самом деле никогда не будет «ненавязчивым», поскольку для пользователей с отключенным javascript не будет изящного отката, если ваша форма не зависит от результата запроса AJAX.