Контроллер Rails не отображает правильное представление, когда форма принудительно отправлена ​​Javascript - PullRequest
0 голосов
/ 02 июня 2010

Я использую Rails с jQuery и работаю над страницей для простого сайта, который печатает каждую запись в таблице. Единственное редактируемое поле для каждой записи - это флажок. Моя цель состоит в том, чтобы каждый раз, когда флажок изменялся, запрос ajax обновляет этот логический атрибут для записи (т. Е. Нет кнопки отправки).

Код моего просмотра:

<td>
<% form_remote_tag :url => admin_update_path, :html => { :id => "form#{lead.id}" } do %>
   <%= hidden_field :lead, :id, :value => lead.id %>
   <%= check_box :lead, :contacted, :id => "checkbox"+lead.id.to_s, :checked => lead.contacted, :onchange => "$('#form#{lead.id}').submit();" %>
<% end %>
</td>

В моем route.rb admin_update_path определяется как

  map.admin_update 'update', :controller => "admin", :action => "update", :method => :post

У меня также есть шаблон RJS для рендеринга обновления. Содержимое этого файла в настоящее время только для тестирования (я просто хотел посмотреть, сработает ли это, это не будет основной функцией при успешном сохранении) ...

page << "$('#checkbox#{@lead.id}').hide();"

При нажатии запрос ajax успешно отправляется с правильными параметрами, и действие на контроллере может извлечь запись и обновить ее просто отлично. Проблема в том, что он не отправляет обратно JS; он изменяет страницу в браузере и отображает сгенерированный Javascript в виде обычного текста, а не выполняет его на месте.

Rails делает кое-что закулисное, чтобы выяснить, является ли входящий запрос вызовом ajax, и я не могу понять, почему он интерпретирует входящий запрос как обычный веб-запрос, а не как запрос ajax.

Возможно, мне здесь не хватает чего-то очень простого, но я как бы обожгла себя, глядя так, что подумала, что я бы попросила еще пару глаз. Заранее спасибо за любую информацию!

Ответы [ 2 ]

0 голосов
/ 03 июня 2010

Этот вопрос относится к этому , но ответ немного отличается. Мне пришлось создать новый способ отправки формы, так как метод submit () по умолчанию jQuery не передает как «скрипт» и, конечно, не запускает код, который Rails генерирует в обработчике onsubmit = "..." через помощник form_remote_tag.

Решением было создать новую функцию, как предполагает связанный ответ, но ее содержание немного отличается:

jQuery.fn.submitWithAjax = function() {
    jQuery.ajax({data:jQuery.param(jQuery(this).serializeArray()) + '&amp;authenticity_token=' + encodeURIComponent('<%= form_authenticity_token %>'), dataType:'script', type:'post', url:'/update'}); 
    return false;
};

Это хрупко сейчас - обратите внимание, что я вставляю rails 'form_authenticity_token в Javascript, но на самом деле метод (post) и URL (/ update) также должны генерироваться, а не жестко кодироваться.

Сейчас все в порядке.

0 голосов
/ 03 июня 2010

В вашем контроллере вам нужно указать правильный ответ. Поскольку вы не разместили контроллер, я просто попытаюсь заполнить пробелы.

def update
  # Update something
  respond_to do |format|
    format.js # this renders your rjs file
  end
end

Указание формата указывает приложению rails интерпретировать javascript, а не просто отправлять его обратно как текст.

Другой вариант вместо использования rjs состоит в том, чтобы сделать встроенный блок rjs следующим образом:

render :update do |page|
  page.replace_html  'user_list', :partial => 'user', :collection => @users
  page.visual_effect :highlight, 'user_list'
end

Используйте встроенные rjs только в том случае, если вы будете вносить минимальные изменения в интерфейс, которые можно поместить в одну или две строки. Все остальное должно быть в его собственном файле rjs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...