Ruby On Rails 3, form_tag удаленный ответ на запрос Ajax

спасибо за чтение этого сообщения. Последние несколько дней я застрял в проблеме с RoR. У меня есть форма в index.html.erb как:

<head>
    <title>Ajax List Demo</title>
    <%= javascript_include_tag :defaults %>  
    <%= csrf_meta_tag %>  
</head>
<body>
  <h3>Add to list using Ajax</h3>

  <% form_tag :action => :list , :method=>:get, :remote=>true  do %>
    Enter the public url:<%= text_field_tag 'url' ,'', :size => 80 %>
    <%= submit_tag "Find" %>
  <% end %>

  <div id="my_list">
  </div>
</body>

В контроллере у меня есть:

 def list
    puts "here!!!!"
    reader = Reader.new
    @profiles =  reader.processURL(params[:url]) #profileList = 
    respond_to do |format|
      #format.html { render :partial=>true, :locals => { :profiles => @profiles}}#{          render :partial=>'profiles/list',:layout => false, :locals => { :profiles => @profiles}} 

format.js {render :content_type => 'text/javascript', :locals => { :profiles => @profiles}}

# index.html.erb
      #   format.rss     render :partial=>'profiles/list',:layout => false, :locals => { :profiles => @profiles}
    end

И файл js для удаленного UJS как list.js.erb

$("#my_list").html("<%= escape_javascript(render(:partial => "list"))%>");

Проблема заключается в том, что я не могу получить результаты для частичного _list.html.erb в теге div my_list. Я получаю пустую страницу, ошибка 406. Если я прокомментирую код html рендеринга в контроллере, я получаю частичную обратную визуализацию в браузере. Я как бы застрял, я хочу отправить форму и результаты, чтобы поп в div my_list. Я новичок в рельсах, поэтому, если я пропущу что-то очевидное, не стесняйтесь указывать на это мне.... Я определенно готов попробовать.


Изменено:

<html>
    <head>
        <title>Ajax List Demo</title>
        <h1>Listing posts</h1>
           <%= javascript_include_tag 'jquery.js' %>  
    <%= csrf_meta_tag %>  
    </head>
    <body>
        <h3>Add to list using Ajax</h3>

        <% form_tag :action => :doit , :method=>:get, :remote=>true  do %>
        Enter the public url:<%= text_field_tag 'url' ,'', :size => 80 %>
        <%= submit_tag "Find" %>
        <% end %>

        <div id="my_list">
                   </div>

Контроллер:

def doit
    puts "here!!!!"
    reader = Reader.new
    @profiles =  reader.processURL(params[:url])
    respond_to do |format|
 #     format.html {render :partial=>true, :locals => { :profiles => @profiles}}#{    render :partial=>'profiles/list',:layout => false, :locals => { :profiles => @profiles}} 
      format.js #{render :content_type => 'text/javascript', :locals => { :profiles => @profiles}}
      # index.html.erb
      #   format.rss     render :partial=>'profiles/list',:layout => false, :locals => { :profiles => @profiles}
    end

JS _doit.js.erb $ ( "# my_list" ). html ( "<% = escape_javascript (render (: partial = > " doit "))% > " );

И, наконец, частичное:

_doit.html.erb.

Однако я все еще получаю ошибку 406, у меня нет дубликата _doit js или erb. Что-то отличное от этого? Еще раз спасибо!


Другое обновление:

Я думаю, что форма не отображается правильно:

Это отображается:

<% form_tag :action => :doit , :remote=>true, :id => 'myform' do %>
        Enter the public url:<%= text_field_tag 'url' ,'', :size => 80 %>
        <%= submit_tag "Find" %>
        <% end %>

Это:

<form accept-charset="UTF-8" action="/home/doit?id=myform&amp;remote=true" method="post">
<div style="margin:0;padding:0;display:inline">
<input name="utf8" type="hidden" value="&#x2713;" />
<input name="authenticity_token" type="hidden" value="MLuau4hvfdGO6FrYCzE0c0JzwHhHKZqjmV49U673sK8=" />
</div>        Enter the public url:
<input id="url" name="url" size="80" type="text" value="" />

    <input name="commit" type="submit" value="Find" />



        <input name="commit" type="submit" value="Find" />

Добавив мой удаленный тег и идентификатор в строку запроса, разве это не так?

В конце концов, наконец, нужно создать форму подсказки:

 <%= form_tag( { :action => 'doit' }, :multipart => true, :remote=>true, :id => 'myform' ) do %>

Хорошо последнее обновление сегодня: Теперь я попал в журналы:

Начинал POST "/home/doit" за 127.0.0.1 в Ср 27 окт 22:40:55 -0400 2010 Вот!!!! Обработка с помощью HomeController # doit as JS Параметры: { "commit" = > "Найти", "url" = > "http://www.facebook.com/people/James-Stewart/653161299", "authenticity_token" = > "MLuau4hvf dGO6FrYCzE0c0JzwHhHKZqjmV49U673sK8 = "," utf8 "= > " Γ £ ô "} Представлено home/_doit.html.erb(4.0ms) Представлено home/doit.js.erb(9.0ms) Завершено 200 OK в 807ms (Просмотров: 40.0ms | ActiveRecord: 0.0ms)

Я вижу JS, и он говорит, что он отображает мой js/partial. Тем не менее, я ничего не получаю в div div. Мой JS файл:

$("#my_list").html("<%= escape_javascript(render(:partial => "doit"))%>");

В моем файле формы html.erb есть:

<script$('#myform').bind('ajax:success', function(evt, data, status, xhr){
    xhr.responseText;
  });></script>

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


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

Отладка JS на Firebug Я вижу html, который я хочу отобразить в div, для этого:

http://localhost:3000/javascripts/prototype.js?1285674435/event/seq/1

Это означает, что я думаю, что теперь получаю ответ JS.

У меня есть это на странице формы:

<script>$('#myform').bind('ajax:success', function(evt, data, status, xhr){
    $('#my_list').html(eval(xhr.responseText));
  });</script>

Инспекции говорят, что он не знает, что такое myform, но я положил: id = > 'myform' в код Rails.


Снова все спасибо, я получил массу помощи здесь, и я хочу поделиться тем, как я наконец вернулся к сообществу.

Файл js для метода doit (требуется лучшее имя действия контроллера) - doit.js

В конечном итоге код:

$("my_list").update("<%= escape_javascript(render(:partial => "doit"))%>");

По какой-то причине оставить его как #my_list не будет найдено в firefox, мне пришлось использовать firebug, чтобы, наконец, понять это.

Очевидно, это отличается от способа, предложенного ниже, и я собираюсь вернуть js script обратно в форму и удалить файл .js.erb и посмотреть, как это работает. Полагаю, я просто отрисовка частичного в ответе format.js? И где каждый находит информацию о написании файлов UJS? Я ничего не знаю о синтаксисе для чего-либо, начиная с $.

Снова спасибо за помощь, наконец, чувствую, что я продвигаюсь по обучению рельсов.

Ответ 1

Я опубликовал этот ответ в Hacker News, но подумал, что сообщество может также выиграть: -)

В Rails 3 драйверы javascript очень удобны (т.е. ненавязчивы). Проблема, с которой вы сталкиваетесь, заключается в том, что ваше приложение возвращает в браузер строку javascript, но на странице нет ничего, что затем выполняет этот javascript в контексте страницы.

Драйвер rails.js ujs связывается с формами и ссылками с data-remote=true, что и делает :remote => true, чтобы заставить их отправлять свои запросы удаленно, но это то, где останавливается магия Rails.

Хорошей новостью является то, что удаленные запросы запускают некоторые события, к которым вы можете привязать, что дает вам доступ к данным, возвращаемым сервером (которые срабатывают в следующем порядке):

  ajax:before
  ajax:loading
  ajax:success
  ajax:complete
  ajax:failure
  ajax:after

Вам нужно связать событие с событием ajax:success вашей формы. Итак, если ваша форма имела идентификатор "myform", вам нужно что-то подобное на вашей странице:

  $('#myform').bind('ajax:success', function(evt, data, status, xhr){
    eval(xhr.responseText);
  });

xhr.responseText - это то, что возвращает ваш сервер, поэтому он просто выполняет его как javascript.

Конечно, он также должен также связываться с событием сбоя с некоторой обработкой ошибок.

Обычно я даже не использую метод action.js.erb для возврата javascript, я просто хочу, чтобы мой контроллер отображал частичный текст HTML, а затем у меня есть привязка как на странице:

  $('#myform').bind('ajax:success', function(evt, data, status, xhr){
    $('#target-div').html(xhr.responseText);
  });

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

EDIT: я закончил эту статью, полностью объясняя удаленные ссылки и формы в Rails 3. Возможно, это поможет:

Rails 3 Удаленные ссылки и формы: Окончательное руководство

Ответ 2

Если вы посмотрите на предоставленный источник своей страницы, вы должны заметить ошибку в атрибутах полей.

Правильный способ сделать это:

<%= form_tag({:action => 'list'}, :remote => true %>

Обратите внимание на фигурные скобки, очень важно! В качестве альтернативы вы могли бы сделать:

<%= form_tag('list', :remote => true %>

Ответ 3

У вас есть 2 частичных имени с именем "_list"? Возможно, это вызывает проблемы, и вы должны просто немного конкретнее:

$("#my_list").html("<%= escape_javascript(render(:partial => "list.html.erb"))%>");


Я не уверен, что это помогает, но если вы используете в IE, имейте в виду, что IE отправляет некоторые заголовки, которые висят, как реагирует ваш контроллер. Таким образом, вы можете отправлять запрос Ajax с помощью IE, но ваше приложение Rails считает его просто простым html-запросом.

Мне пришлось настроить jQuery, чтобы сначала стереть текущие заголовки, а затем добавить только заголовок javascript:

$.ajaxSetup({
'beforeSend': function(xhr) {xhr.setRequestHeader("Accept",'');xhr.setRequestHeader("Accept", "text/javascript")}

})

Ответ 4

Использование list, поскольку может возникнуть проблема с именем вашей функции в контроллере. Это имя используется внутри Rails.