проблемы с рельсами ajax call - PullRequest
1 голос
/ 13 октября 2010

Я довольно новичок в рельсах, так что прости меня, если я совершил здесь какую-то глупую ошибку.Я пытаюсь сделать ajax-вызов с link_to и ответить на шаблон js.erb.Это не так хорошо.Ссылка отображается правильно:

 <a href="/show" data-method="post" data-remote="true" rel="nofollow">Click</a>

Баскетбольное действие show:

def show
  respond_to do |format|
    format.js {render :layout => false}
  end
end

И show.js.erb просто содержит предупреждение для тестирования.Когда я нажимаю на ссылку, меня бесцеремонно ведут на localhost: 3000 / show, который полностью пуст.Кажется, что это запрос GET, несмотря на объявление метода как POST, и я получаю ошибку «406 Not Acceptable».

Started GET "/show" for 127.0.0.1 at Tue Oct 12 19:58:17 -0500 2010
Processing by PostsController#show as HTML
Completed 406 Not Acceptable in 1ms

edit: я выполнил тест request.xhr в действии show и, по-видимому,Ajax-вызов не выполняется.Так что я тут не так делаю?

Ответы [ 2 ]

1 голос
/ 13 октября 2010

Из вашего описания видно, что к вашей ссылке не подключены ненавязчивые слушатели JavaScript, и поэтому браузер просто следует по ссылке href ссылки.Таким образом, проблема, кажется, на стороне клиента.

Но ваш вопрос не дает достаточно подробностей, чтобы дать прямой ответ, поэтому я просто перечислю все шаги, которые я предприму, чтобы исследовать это.

Сначала, чтобы сделать этоДля работы вы должны включить все необходимые javascripts и метатеги csrf в ваш макет <head>.Лучше всего сделать это с помощью:

<%= javascript_include_tag :defaults %>
<%= csrf_meta_tag %>

Если у вас есть это, загрузите страницу и посмотрите на источник, если он действительно генерирует ссылки правильно.Вы должны увидеть что-то вроде этого:

<head> 
    <script src="/javascripts/prototype.js?1285857859" type="text/javascript"></script> 
    <script src="/javascripts/effects.js?1285857859" type="text/javascript"></script> 
    <script src="/javascripts/dragdrop.js?1285857859" type="text/javascript"></script> 
    <script src="/javascripts/controls.js?1285857859" type="text/javascript"></script> 
    <script src="/javascripts/rails.js?1285857859" type="text/javascript"></script> 
    <script src="/javascripts/application.js?1285934960" type="text/javascript"></script> 
    <meta name="csrf-param" content="authenticity_token"/> 
    <meta name="csrf-token" content="b2HRysd23edj1/vrCSRDSac0seDFae3n2gCoTjt0="/> 
</head>

Если они есть, я бы установил отладчик Firebug Javascript или использовал инструменты разработчика Chrome, включил его и посмотрел, есть ли ошибки на странице.когда он загружен и когда вы нажимаете на ссылку.Вы также можете просмотреть отправленные запросы и посмотреть, являются ли они xhr тогда и там.

Если это все еще не работает, откройте rails.js в Firebug и установите точку останова перед тем фрагментом кода, который отвечает заприсоединение слушателей к data-remote и / или data-method.Это:

document.on("click", "a[data-remote]", function(event, element) {
    if (event.stopped) return;
    handleRemote(element);
    event.stop();
  });

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

И просто общее примечание - я думаю, show действие должно быть доступно с get, а не post.

- РЕДАКТИРОВАТЬ -

Я думаю, что 406 not acceptable возвращается, потому что у вас нет format.html в вашем блоке respond_to.Если вы добавите его, он должен просто отобразить шаблон show.html.erb.

0 голосов
/ 15 октября 2010

Ага, проблема была в том, что jQuery конфликтовал с prototype.js. Я установил для него режим noConflict, и он работал.

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