link_to с параметрами jquery в рельсах

Я хочу выполнить поиск на месте в своем приложении rails.
Я использовал button_to_remote с прототипом, но теперь я использую JQuery, поэтому я перешел на link_to.
Вот мой код:

<%= link_to "Search", {:action => "geocode", :with => "'address='+$('#{address_helper_id}').value"}, :method => :post, :remote => true %>

Я хочу передать текстовое поле адреса моему контроллеру, но результат не такой, как я ожидал.

/mycontroller/geocode?with=%27address%3D%27%2B%24%28%27record_location___address%27%29.value

Как я могу отправить свое значение?


person pasine    schedule 27.11.2010    source источник


Ответы (4)


Возможно, вы захотите попробовать подходить к вещам немного более ненавязчиво. Я бы рекомендовал заменить ваш вызов link_to чем-то вроде:

<%= link_to "Search", "#", :id => "search_geocode", :"data-href" => my_controller_geocode_path %>

Это практически идентично тому, что у вас уже есть, за исключением того, что оно включает уникальный идентификатор, а также путь контроллера/геокода в атрибуте data-href. Это поможет вам немного разделить ruby ​​и javascript.

Затем в вашем application.js (или где-то подобном):

$('#search_geocode').live('click', function(event){
    event.preventDefault();
    $.post($(this).attr('data-href') + "?address=" + $('#address').val(), function(data){} );
});

Что это эффективно делает, так это привязывает прослушиватель событий click к вашей кнопке поиска, который отправляет адрес на URL-адрес или путь, указанный в атрибуте data-href вашей поисковой ссылки.

Я также заметил, что в вашем коде вы устанавливаете id исходного адреса в ruby. Если этот атрибут id нужно изменить в зависимости от каких-то условий шаблона страницы, вы можете расширить мой пример, добавив еще один параметр data- в свою ссылку. Например:

<%= link_to "Search", "#", :id => "search_geocode", :"data-href" => my_controller_geocode_path, :"data-address-id" => address_helper_id %>

И снова в application.js замените вышеприведенное на что-то вроде:

$('#search_geocode').live('click', function(event){
    event.preventDefault();
    $.post($(this).attr('data-href') + "?address=" + $($(this).attr('data-address-id')).val(), function(data){} );
});
person theTRON    schedule 07.12.2010
comment
внимание: я думаю, что .live устарел. Смотри ниже. $(селектор).live(события, данные, обработчик); // jQuery 1.3+ $(документ).делегат(селектор, события, данные, обработчик); // jQuery 1.4.3+ $(документ).on(события, селектор, данные, обработчик); // jQuery 1.7+ по этой ссылке: api.jquery.com/live - person Christiano Matos; 11.03.2020

Самый простой способ — поместить поле поиска и кнопку отправки в обычную форму (используя хелперы представлений рельсов по умолчанию). И вы добавляете в форму опцию :remote => :true. См. документацию в form_for url help.

Я думаю, вы уже добавили файл rails.js для jquery.

Делая это так, вы автоматически отправите форму через ajax для данного действия.

После этого вам нужен только обработчик событий ajax:success, чтобы вы могли обрабатывать данные.

$('<id of the form').bind('ajax:success', function(event, data, status, xhr) {
   ... process your data here ...
} 
person Christiaan Van den Poel    schedule 08.12.2010

Вы можете попробовать это:
<%= text_field_tag :address %>
<%= submit_tag "Search", :id => "search_button" %>


### Paste following code in your javascript

$("#search_button").live("click", function(){
  $.ajax({
    complete:function(request){},
    data:'address='+ $('#address').val(),
    dataType:'script',
    type:'get',
    url: '[ROUTE TO ACTION]' // in your case, may be '/[CONTROLLER NAME]/geocode' until you define route
  })
});


person Nimesh Nikum    schedule 03.12.2010

Это не совсем прямой ответ на ваш вопрос, но вы изучали jrails? Это позволяет вам использовать те же помощники прототипа javascript, которые вы использовали до перехода на jquery. Это сделало мой переход от прототипа к jquery намного проще.

person JackCA    schedule 27.11.2010