form_remote_for не выполняет RJS, просто отображает JS

Я использую прототип/rjs на rails 2.3.3 и ruby ​​1.86, и мой form_remote_for для моего контроллера «create» просто отображает create.js.rjs вместо его выполнения. Странно то, что все остальные действия + rjs работают нормально, только действие «создать» не работает. Любая помощь будет оценена по достоинству. Заранее спасибо!

ОБНОВЛЕНИЕ: Чтобы уточнить, это должно работать: _form submit -> POST -> create method -> js -> загрузить другой частичный. Вместо этого он работает: _form submit -> POST -> create method -> вывод js в виде текста

_form.html.haml:

- form_remote_for(@network) do |f|
  = f.error_messages
  %p><
    = f.label :name
    = f.text_field :name
  %p><
    = f.label :image_url
    = f.text_field :image_url
  %p><
    = f.label :url
    = f.text_field :url
  %p><
    = f.submit "Create"

создать.js.rjs:

page.insert_html(:bottom, :networks, :partial => 'networks/network', :object => @network);

network_controller:

def create
  @network = Network.new(params[:network])

  respond_to do |format|
    if @network.save
      flash[:notice] = 'Network was successfully created.'
      format.js #also doesn't work with { render :layout => false }
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @network.errors, :status => :unprocessable_entity }
      format.js
    end
  end
end

вывод (он отображается как html):

try {
Element.insert("networks", { bottom: "<div class='network'>\n  <img alt=\"Df\" src=\"/images/df\" />\n  <a href=\"d\">wer</a>\n  <a href=\"/networks/39\">Show</a>\n  <a href=\"/networks/39/edit\">Edit</a>\n  <a href=\"/networks/39\" onclick=\"if (confirm('Are you sure?')) { var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var m = document.createElement('input'); m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); m.setAttribute('value', 'delete'); f.appendChild(m);var s = document.createElement('input'); s.setAttribute('type', 'hidden'); s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', 'dfleb/EzulRpXnZekVfbhAkX3G9jHmhnWTBLSk7iRSE='); f.appendChild(s);f.submit(); };return false;\">Destroy</a>\n</div>\n" });
} catch (e) { alert('RJS error:\n\n' + e.toString()); alert('Element.insert(\"networks\", { bottom: \"<div class=\'network\'>\\n  <img alt=\\\"Df\\\" src=\\\"/images/df\\\" />\\n  <a href=\\\"d\\\">wer</a>\\n  <a href=\\\"/networks/39\\\">Show</a>\\n  <a href=\\\"/networks/39/edit\\\">Edit</a>\\n  <a href=\\\"/networks/39\\\" onclick=\\\"if (confirm(\'Are you sure?\')) { var f = document.createElement(\'form\'); f.style.display = \'none\'; this.parentNode.appendChild(f); f.method = \'POST\'; f.action = this.href;var m = document.createElement(\'input\'); m.setAttribute(\'type\', \'hidden\'); m.setAttribute(\'name\', \'_method\'); m.setAttribute(\'value\', \'delete\'); f.appendChild(m);var s = document.createElement(\'input\'); s.setAttribute(\'type\', \'hidden\'); s.setAttribute(\'name\', \'authenticity_token\'); s.setAttribute(\'value\', \'dfleb/EzulRpXnZekVfbhAkX3G9jHmhnWTBLSk7iRSE=\'); f.appendChild(s);f.submit(); };return false;\\\">Destroy</a>\\n</div>\\n\" });'); throw e }

Обновлять:

_networks.html.haml:

%div{:id=> 'network#{network.id}', :name => 'network'}
  = image_tag network.image_url
  = link_to network.name, network.url
  - if logged_in? && self.current_user.login = "admin"
    = link_to 'Show', network
    = link_to 'Edit', network_path(network), :method => :put, :class => "put"
    = link_to 'Destroy', network_path(network), :method => :delete, :class => "delete"
  %br

person user117046    schedule 21.12.2009    source источник


Ответы (2)


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

Вы также можете заставить его работать, обернув свои rjs с помощью

page << ' '

Убедитесь, что у вас нет параметра обновления ни в одном из ваших кодов просмотра. Параметр update искажает контекст. Подробнее см. в этом сообщении.

person coreypurcell    schedule 21.12.2009
comment
Кори, спасибо за ответ. Частичного нет - это POST через создание, поэтому он просто перенаправляет на html - person user117046; 22.12.2009
comment
Я имею в виду эту строку: page.insert_html(:bottom, :networks, :partial =› 'networks/network', Что находится в части сетей/сети? - person coreypurcell; 22.12.2009
comment
Я добавил часть сетей/сети. Спасибо за ссылку для объяснения - имеет большой смысл; однако перенос его на страницу ‹‹ ' ' не решил проблему. Еще один фактор, который, как я думал, не повлияет на эту проблему, заключался в том, что я использую отдельный контроллер/представление индекса, который имеет частичную сеть/сеть, и загружаю частичную сеть/форму через rjs по новой сетевой ссылке и надеюсь чтобы обновить div, повторно загрузив часть сетей/сетей. Должен быть лучший способ сделать это, но было бы здорово понять эту проблему на будущее. Есть предположения? - person user117046; 22.12.2009
comment
Ничто в вашем коде не кажется мне неправильным. Я заметил, что html, сгенерированный в ответе AJAX, не такой, как я ожидал, согласно вашему частичному. В частности, тег div не имеет правильных атрибутов в сгенерированном js. Я бы начал отладку там и посмотрел, что Firebug дает вам в ответе AJAX. - person coreypurcell; 23.12.2009
comment
Что касается вашего другого вопроса, я бы не стал использовать вызов на стороне сервера, чтобы просто показать форму по новой ссылке. У меня был бы html уже на странице, и я бы просто использовал некоторый код на стороне клиента, чтобы показать скрытую форму. Это сэкономит вам http-запрос. Дайте мне знать, если вам нужна дополнительная информация о том, как это сделать. - person coreypurcell; 23.12.2009
comment
Параметр обновления в вызове link_to_remote был причиной этого для меня. - person nuclearsandwich; 24.10.2010

У меня была именно эта проблема. Я решил эту проблему, убедившись, что ‹%= javascript_include_tag :defaults %> был указан ПОСЛЕДНИМ среди всех моих тегов javascript_include. Попробуйте это.

person Sean Ahrens    schedule 22.11.2010