Ajax с Rails 3 и jQuery - вызывается из JS - PullRequest
2 голосов
/ 07 апреля 2011

Цель состоит в том, чтобы визуализировать форму редактирования, вызвав какую-то функцию $.ajax в моем javascript.

Я использую FullCalendar для отображения некоторых событий, поэтому я хотел бы реализоватьчто-то, что позволяет пользователю нажимать на событие и отображать нашу существующую форму редактирования где-то на странице.

Так вот, где я хочу это сделать:

// the javascript
eventClick: function(calEvent, jsEvent, view) {
  $.ajax({
    url: '/course_offerings/'+calEvent.id+'/edit',
  });
},

eventClick по сути является обратным вызовом после нажатия на событие:)

calEvent.id является идентификатором course_offering Так что, к сожалению, у меня нет доступа к хорошим :remote => 'true' вариантам настройки ссылок.

Вот несколько фрагментов кода:

# controller edit function
@course_offering = CourseOffering.find(params[:id])
respond_to do |format|
  format.html
  format.js
end

# edit.js.erb, quickedit is the div where I want the form to render
$('#quickedit').append('hi');

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

Кроме того, требования для вызова jquery $.ajax в среде Rails в значительной степенидля меня загадка.

Редактировать 1:

Ооочень закрыть

Я попробовал следующее:

$.ajax({
    dataType: 'script',
    url: "/course_offerings/1/edit"
});  

И вЯ получил отладчик Chrome:

http://localhost:3000/course_offerings/1/edit?_=1302199862022 500 (Internal Server Error)

Я не делал никаких специальных настроек заголовка, поэтому я думаю, что это может быть проблемой

Редактировать 2

ActionView::Template::Error (Missing partial course_offerings/edit with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:js, :html], :locale=>[:en, :en]} in view paths "/home/emp/ror/smarssched/app/views", "/home/emp/.rvm/gems/ruby-1.9.2-p136/gems/devise-1.1.5/app/views"):
    1: $("#quick_edit").html(<%= escape_javascript(render :partial => 'edit', :object => @course_offering) %>)

Я переключил партиал на редактирование после получения ошибки с :partial => 'course_offering'

Чтобы, надеюсь, отредактировать партиал редактирования.

Редактировать 3

ActionView::Template::Error (undefined method `formats' for nil:NilClass):
    1: $("#quick_edit").html(<%= escape_javascript(render :action => 'edit', :object => @course_offering) %>)
  app/views/course_offerings/edit.js.erb:1:in `_app_views_course_offerings_edit_js_erb__58426168_85487740_698365018'
  app/controllers/course_offerings_controller.rb:48:in `edit'

# Line 46-51 edit function
 def edit
@course_offering = CourseOffering.find(params[:id])
respond_to do |format|
     format.html
     format.js
    end
 end

Если я уберу блок response_to, он выдаст ту же ошибку.

1 Ответ

1 голос
/ 07 апреля 2011

Прежде всего, чтобы прокомментировать ваше последнее предложение, таких требований для выполнения вызовов ajax между jquery и Rails не существует.Они не знают друг о друге, и им все равно.Пока ваш URL-адрес правильный и вы отправляете правильные данные, когда это уместно, все в порядке.Вам просто нужно убедиться, что ваш заголовок запроса установлен правильно.По умолчанию jQuery делает «интеллектуальное предположение», поэтому я считаю, что всегда полезно указывать, что вы хотите.Смотрите документы здесь, но в вашем случае это означает добавление:

dataType: 'script'

к вашему вызову ajax

Что касается правильных способов сделать что-то, это выглядит правильно и довольно стандартно.В вашем файле edit.js.erb вы в основном хотите визуализировать свое представление и добавить его в #quickedit.Что-то вроде этого должно быть достаточно:

$("#quickedit").html(<%= escape_javascript(render :partial => 'course_offering', :object => @course_offering) %>)

Обратите внимание, что 'course_offering' должен быть частично определен в текущей папке просмотра, то есть /app/views/course_offerings/_course_offering.html.erb при условии, что вы находитесь в контроллере course_offerings.

В вашем случае вы используете 'edit', но я предполагаю, что редактирование - это не частичное (т.е. HTML-фрагмент), а скорее полное действие.В этом случае попробуйте render :action => 'edit'

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