У меня проблемы с удаленно выполняемым действием и партиалом, который не обновляется при первом нажатии на ссылку.
Внутри представления (частичное имя books
) я создаю ссылку:
link_to "⊗", read_book_path(book), :remote => true
read_book_path
определено в rout.rb
Существует также условие, которое отображает другой текст при чтении этой книги.
Внутри моего контроллера я определил новое действие:
def read
@books = Book.all
@book = Book.find(params[:id])
@book.read = !@book.read
@book.save
respond_to do |format|
format.html { redirect_to(books_url) }
format.js {render :layout => false, :locals => { :book => @book } }
end
end
Это означает, что мне нужен файл read.js.erb
, содержимое этого файла:
$("#books").empty().html("<%= escape_javascript( render(:partial => "books") ) %>");
Когда я нажимаю на ссылку, я вижу в окне терминала, что поле базы данных обновлено, а частичное - нет. Повторное нажатие на ту же ссылку обновляет частичное.
Изменение ссылки на :remote => false
также работает, но страница перезагружается (как и ожидалось).
Я попытался отладить его с помощью Safari и инструментов разработчика, и я вижу ответ сервера при первом нажатии на ссылку.
Там что-то не так, HTML, сгенерированный <%= escape_javascript( render(:partial => "books") ) %>
, содержит неправильный HTML со старым содержанием партиала. Только второй или третий щелчок показывает обновленный HTML.
Я интегрировал jquery-ujs - по этой ли причине частичное не обновляется в первый раз или я что-то упустил?
Это действительно дало мне головную боль, вы можете мне помочь?
Edit:
Если это поможет: я создал слушателя в application.js для ajax:before
и ajax:complete
. Первый показывает небольшой счетчик, второй скрывает его.
Когда я нажимаю на ссылку, вертушка отображается, но она не скрывается.