Создайте поле выбора, которое вызывает метод

У меня есть приложение rails с рабочими отчетами с тегами. В Report/Index.html.erb я хочу, чтобы пользователь мог сортировать отчеты, выбирая тег. Они могут выбирать только один тег за раз, поэтому я считаю, что поле выбора будет работать лучше всего. В настоящее время у меня есть это:

<%= select("preferences", :tag_with, 
 ["Politics", "Technology", "Entertainment", "Sports", "Science", "Crime", 
 "Business", "Social", "Nature", "Other"], :prompt => "Filter Feed by:" )%>

У меня есть рабочий контроллер настроек с вызовом метода tag_with, который обновляет текущий тег. Однако этот код генерирует только поле выбора. Я хочу, чтобы когда пользователь выбирает один из тегов, он вызывал метод tag_with из контроллера настроек.

Я сгенерировал серию из link_to строк, которые завершают задачу, однако мне бы очень хотелось окно выбора.

<%= link_to "Politics", :action => "tag_with", :tag => "Politics", :controller =>"preferences" %>
<%= link_to "Entertainment", :action => "tag_with", :tag => "Entertainment", :controller =>"preferences" %>
<%= link_to "Science", :action => "tag_with", :tag => "Science", :controller =>"preferences" %>
<%= link_to "Technology", :action => "tag_with", :tag => "Technology", :controller =>"preferences" %>

И так по каждому тегу. Это прекрасно работает, но громоздко и нежелательно. Есть ли способ сделать то же самое через поле выбора?


person Vasseurth    schedule 22.04.2012    source источник
comment
Вы пытались просто связать событие onchange поля выбора?   -  person Mark Fraser    schedule 23.04.2012
comment
Как я мог это сделать? Я не был уверен, к чему привязать событие onChange. Я пробовал onChange =› link_to ... но это не работает.   -  person Vasseurth    schedule 23.04.2012
comment
Во-первых, это должно быть сделано ненавязчиво (дайте выбору идентификатор и обработайте событие в javascript). См. railscasts.com/episodes/205-unobtrusive-javascript и результаты Google для unobtrusive javascript rails для больше информации. Какая версия рельсов? Вы используете Coffee Script или просто javascript? Дайте мне знать, и я отправлю полный ответ, если вам все еще нужна помощь.   -  person Mark Fraser    schedule 23.04.2012
comment
В настоящее время я использую javascript JQuery, но я довольно слаб с языком. Я использую Rails версии 3.2.   -  person Vasseurth    schedule 23.04.2012


Ответы (1)


В вашем файле reports.js.coffee или любом другом файле js, который вы хотите.

jQuery ->
  $('select#preferences').change ->
    $.get 'preferences/tag_with',{ term: $('option:selected', this). val() }

Или, если вы хотите использовать обычный javascript:

$(function(){
  $('select#preferences').change( function() {
    $.get('preferences/tag_with',{term: $('option:selected',this).val()});
  });
});

Ссылка — это GET-запрос. Метод jQuery .change() срабатывает всякий раз, когда кто-то вносит изменения. Метод $.get отправляет запрос GET на URL-адрес и может передавать данные (второй аргумент). Эти данные становятся вашим хэшем параметров, поэтому в приведенном выше примере вы получите:

params[:term] #=> the value attribute of whatever option was selected by the user

См. документацию по jQuery на страницах .change() и $.get() для получения дополнительной помощи.


Обновить

Чтобы обновить страницу, проще всего извлечь таблицу, которую вы хотите изменить, в частичную, предположим, что она называется _report.html.erb. Партиал должен выглядеть примерно так:

<div id="report">
  <%= render @report %>
</div>

*Примечание: render @report — это сокращение от render :partial => 'report'. См. http://guides.rubyonrails.org/layouts_and_rendering.html*.

В вашем контроллере настроек, опция tag_with, вы должны обязательно установить объект @report (или что-то еще, доставляющее данные в ваш частичный).

Затем вы должны создать файл с именем views/preferences/tag_with.js.erb и поместить в него что-то вроде этого:

$('div#report').html('<%= escape_javascript( render @report ) %>');

Это обновит контейнер отчета новым содержимым.

person Andrew    schedule 22.04.2012
comment
Это прекрасно работает! Однако он меняет фильтр только ПОСЛЕ перезагрузки страницы. Есть ли способ сделать это автоматически? - person Vasseurth; 23.04.2012
comment
Мне кажется, что когда я использую link_to, я получаю Processing by ReportsController#index as HTML, но когда я использую выбор, я получаю Processing by ReportsController#index as *\*. Вы знаете причину этого? - person Vasseurth; 23.04.2012
comment
Попробуйте использовать 'preferences/tag_with.js' в качестве URL-адреса и посмотрите, что произойдет. - person Andrew; 23.04.2012
comment
Его еще нужно освежить. Есть ли способ автоматического обновления через JQuery? Или даже в методе settings#tag_with? - person Vasseurth; 23.04.2012
comment
О, да, страницу нужно обновить с помощью jQuery. Ожидается обновление. - person Andrew; 23.04.2012