Как обновить содержимое div после того, как значения ActiveRecord будут изменены без перезагрузки страницы? - PullRequest
1 голос
/ 13 января 2011

Я использую Ruby on Rails 3 с Prototype / Scriptaculous и пытаюсь обновить содержимое div после того, как значения ActiveRecord будут изменены, без перезагрузки страницы.

В "edit.html.erb" у меня есть:

...

<div id="test_id">
  <%= @account.name.to_s %>
</div>

<%= link_to_function( "Make test" ) do |page|
  page.replace_html :test_id, @account.name.to_s
end %>

...

Прежде чем нажать «Сделать тест», я обновляю значение «@ account.name», даже через AJAX. Затем, нажав «Сделать тест», шаблон не изменится.

Это шаги:

  1. Я показываю страницу
  2. Я обновляю '@ account.name' через AJAX
  3. Я нажимаю «Сделать тест»
  4. 'div' с 'id = "test_id"' не меняется!

Что я делаю не так?

P.S .: Я думаю, что @account не перезагружается на странице, даже если его значения изменены в базе данных. Если да, что мне делать?


Я видел Railscasts " AJAX с RJS ", и я последовал примеру в этом (это как мой), но он не работает для меня.

1 Ответ

1 голос
/ 13 января 2011

Если вы отредактировали файл edit.html.erb, когда значение @ account.name равно «George», HTML-код останется прежним (со значением «George»), пока вы не обновите его. Ваш вызов link_to_function при загрузке страницы отображает ссылку html, которая вызывает javascript, который заменяет внутренний html div «test_id» на «George». Если вы не замените этот HTML-код, он всегда будет заменять внутренний HTML-код этого элемента «Джордж».

Трудно рекомендовать решение, не зная точно, что вы хотели бы сделать ...

обновлено, чтобы иметь больше деталей:

Если вы делаете вызов AJAX, который изменяет значение имени учетной записи на сервере на «Fred», и хотите, чтобы это изменение появилось на странице, вам следует обновить части страницы, которые используют это значение в этом тот же AJAX-вызов (то же действие контроллера).

Ваша функция link_to_ генерирует HTML следующим образом (если @ account.name был 'George', когда страница отображалась):

<a onclick="try { Element.update("test_id", "George"); ... >Make test</a>

Это не вызов ajax, это просто ссылка, выполняющая javascript. Если вы хотите сделать это вызовом ajax, который находит значение latest имени учетной записи и обновляет div test_id, выполните что-то вроде этого:

<%# you need prototype included, but it should probably be in application.rhtml %> 
<%= javascript_include_tag "prototype.js" %>

<div id="test_id">
  <%= @account.name.to_s %>
</div>

<%= link_to_remote "Make test", :url => { :controller => "account", :action => "change_name" } %>

Ссылка «Создать тест» теперь будет выполнять AJAX-вызов метода «имя-изменения» в контроллере «учетной записи». Этот метод будет выглядеть примерно так:

def change_name
  # here you would load the account from the db; I'm cheating
  @account = Account.new(:name => "Fred")

  render :update do |page|
    page.replace_html :test_id, :text => @account.name.to_s
  end
end
...