Туплю с AJAX

19 views
Skip to first unread message

Alexander Oryol

unread,
Sep 7, 2007, 1:45:24 PM9/7/07
to RubyOnRails to russian
Здоровеньки булы!

Ребят, чувствую что где-то ступил, а понять не могу где.
В коде страницы использую link_to_remote ...
В коде RJS использую page.replace_html ...
Запрос нормально уходит, ответ нормально генерится, id элементов
совпадают.

НО: вместо того чтобы обновить содержимое указанного элемента на
контент сгенеренный partials, я получаю в содержимом элемента:
Element.update("pages_6", "[здесь нужный мне контент]")....
т.е. оно прямо так и выводится, а не обрабатывается javascript'oм.

Где я ступил?

--
Александр Орел

Michael Klishin

unread,
Sep 7, 2007, 3:13:04 PM9/7/07
to ror...@googlegroups.com
Наверное вместо page.replace 'page_6', :partial => "..."

у вас что-то типа

page.replace('page_6', render :partial => "...")

то есть все что после id элемента идет на рендер, и если там просто
текст -- получаем просто текст.

prototype_helper.rb:671

def render(*options_for_render)
old_format = @context && @context.template_format
@context.template_format = :html if @context
Hash === options_for_render.first ?
@context.render(*options_for_render) :
options_for_render.first.to_s
ensure
@context.template_format = old_format if @context
end

Alexander Oryol wrote:

> НО: вместо того чтобы обновить содержимое указанного элемента на
> контент сгенеренный partials, я получаю в содержимом элемента:
> Element.update("pages_6", "[здесь нужный мне контент]")....
> т.е. оно прямо так и выводится, а не обрабатывается javascript'oм.
>
> Где я ступил?


--
MK

Max Lapshin

unread,
Sep 7, 2007, 4:30:27 PM9/7/07
to ror...@googlegroups.com
В чём проблема я догадываюсь, но показывай код того места, где ты вызываешь link_to_remote и сам контроллер.


Alexander Oryol

unread,
Sep 8, 2007, 3:13:54 AM9/8/07
to RubyOnRails to russian
On Sep 8, 12:30 am, "Max Lapshin" <max.laps...@gmail.com> wrote:
> В чём проблема я догадываюсь, но показывай код того места, где ты вызываешь
> link_to_remote и сам контроллер.

В 3 часа ночи попробовал дунуть сдругого конца.... нарисовал тестовый
примерчик. Видимо туплю я "кучно".

test_controller.rb:
class TestController < ApplicationController
def probe
end
def update
end
end

probe.rhtml:
<p id="pro"><%= render :partial => 'text' %></p>
<%= link_to_remote "Click this!", :url => { :action => 'update' },
:update => 'pro' %>

_text.rhtml:
Text for my testing

update.rjs:
page.replace_html 'pro', :partial => 'newtext'

_newtext.rhtml:
This is new text

Это все.

Выводится:
try { Element.update("pro", "This is new text"); } catch (e)
{ alert('RJS error:\n\n' + e.toString()); alert('Element.update(\"pro
\", \"This is new text\");'); throw e }

Когда я в контроллере делаю:
def update
render_text 'This is new text.'
end - оно работатет.
(конечно update.rjs убираю)

Когда:
def update
render :update do |page|
page.html_replace 'pro', :partial => 'newtext'
end
end - нет.

Где оно, утреннее просветление?

--
Орел Александр

Max Lapshin

unread,
Sep 8, 2007, 3:27:15 AM9/8/07
to ror...@googlegroups.com
Конечно же ничего не будет работать. Прочитай документацию на link_to_remote в части ключей update и evalScripts


Alexander Oryol

unread,
Sep 8, 2007, 3:53:21 AM9/8/07
to RubyOnRails to russian
On Sep 8, 11:27 am, "Max Lapshin" <max.laps...@gmail.com> wrote:
> Конечно же ничего не будет работать. Прочитай документацию на link_to_remote
> в части ключей update и evalScripts

Прочел раз 10. Просветление не наступает. Вроде делаю все как в
документации и примерах.

Alexander Oryol

unread,
Sep 8, 2007, 4:38:27 AM9/8/07
to RubyOnRails to russian
> On Sep 8, 11:27 am, "Max Lapshin" <max.laps...@gmail.com> wrote:
> > Конечно же ничего не будет работать. Прочитай документацию на link_to_remote
> > в части ключей update и evalScripts

Удалил ключ :update => 'pro' - заработало. Но почему??

P.S. Угу, поток сознания, да.

Maxim Kulkin

unread,
Sep 8, 2007, 6:38:15 AM9/8/07
to ror...@googlegroups.com

Понятно, что когда ставишь "апдейт", то он тупо ждет, что ты ему
пришлешь контент, которым надо апдейтить. Если там будет яваскрипт, то
он его и всунет (выполнять не будет). Насколько я помню, там по
умолчанию стоит evalScripts, поэтому можно завернуть твои апдейты в
<script type="text/javascript"> ... </script> и оно по идее должно
работать. Другое дело, что это плохой подход. Вообще, использование
ключика :update в link_to_remote имеет очень узкую область
применимости. Гораздо лучше убрать :update, тогда он будет пытаться
выполнить текст как яваскрипт (если, насколько я помню, вы правильно
выставите контент-тайп в text/javascript).

Alexander Oryol

unread,
Sep 8, 2007, 7:28:08 AM9/8/07
to RubyOnRails to russian
On Sep 8, 2:38 pm, "Maxim Kulkin" <maxim.kul...@gmail.com> wrote:

> On 9/8/07, Alexander Oryol <eagle.a...@gmail.com> wrote:
> > > On Sep 8, 11:27 am, "Max Lapshin" <max.laps...@gmail.com> wrote:
> > > > Конечно же ничего не будет работать. Прочитай документацию на link_to_remote
> > > > в части ключей update и evalScripts
> > Удалил ключ :update => 'pro' - заработало. Но почему??
> Понятно, что когда ставишь "апдейт", то он тупо ждет, что ты ему
> пришлешь контент, которым надо апдейтить. Если там будет яваскрипт, то
> он его и всунет (выполнять не будет). Насколько я помню, там по
> умолчанию стоит evalScripts, поэтому можно завернуть твои апдейты в
> <script type="text/javascript"> ... </script> и оно по идее должно
> работать. Другое дело, что это плохой подход. Вообще, использование
> ключика :update в link_to_remote имеет очень узкую область
> применимости. Гораздо лучше убрать :update, тогда он будет пытаться
> выполнить текст как яваскрипт (если, насколько я помню, вы правильно
> выставите контент-тайп в text/javascript).

Как это понял я (если не прав - поправьте!):
1. Если мы ставим ключ :update, то тем самым указываем на стороне
принимающего html, что содержимое конкретного элемента надо заменить
на то, то вернется в результате AJAX запроса.
2. Если мы ключ :update не ставим, то мы интерпретируем пришедший
ответ как JS. Таким образом, что надо сделать со страницей (например
какой элемент обновить) определяется только на стороне сервера.

И в том и в другом случае: evalScripts:true, просто разные объекты из
Prototype дергаются:
1. new Ajax.Updater('pro', '/test/update', {asynchronous:true,
evalScripts:true}); return false;
2. new Ajax.Request('/test/update', {asynchronous:true,
evalScripts:true}); return false;

Спасибо за пинок в нужном направлении!

--
Александр Орел

Max Lapshin

unread,
Sep 8, 2007, 1:10:49 PM9/8/07
to ror...@googlegroups.com
On 9/8/07, Alexander Oryol <eagle...@gmail.com> wrote:
Как это понял я (если не прав - поправьте!):
1. Если мы ставим ключ :update, то тем самым указываем на стороне
принимающего html, что содержимое конкретного элемента надо заменить
на то, то вернется в результате AJAX запроса.
2. Если мы ключ :update не ставим, то мы интерпретируем пришедший
ответ как JS. Таким образом, что надо сделать со страницей (например
какой элемент обновить) определяется только на стороне сервера.

Да. Я ни разу не сталкивался с ситуацией, что бы :update был бы реально применим.

Олег Балбеков

unread,
Sep 9, 2007, 4:12:10 AM9/9/07
to RubyOnRails to russian
Я прошу прощения за оффтоп,
в данный момент тоже разбираюсь с рельсовым аяксом.
Не могли бы вы дать ссылки на документацию и описание, которыми вы
пользуетесь?

Maxim Kulkin

unread,
Sep 9, 2007, 4:54:50 AM9/9/07
to ror...@googlegroups.com
On 9/9/07, Олег Балбеков <oleg.b...@gmail.com> wrote:
> Я прошу прощения за оффтоп,
> в данный момент тоже разбираюсь с рельсовым аяксом.
> Не могли бы вы дать ссылки на документацию и описание, которыми вы
> пользуетесь?

Какая там документация ?!

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

Alexander Oryol

unread,
Sep 9, 2007, 2:38:43 PM9/9/07
to RubyOnRails to russian
On Sep 9, 12:12 pm, Олег Балбеков <oleg.balbe...@gmail.com> wrote:
> Я прошу прощения за оффтоп,
> в данный момент тоже разбираюсь с рельсовым аяксом.
> Не могли бы вы дать ссылки на документацию и описание, которыми вы
> пользуетесь?

Да вообщем-то в основном api.rubyonrails.org, AWDwR, плюс найденное в
гугле по теме (довольно мало нашлось так чтобы с объяснением _как_ это
работает и самое главное в чем разница вызовов, я бы сказал "ничего"),
ну и метод тыка.

--
Alexander Oryol

Reply all
Reply to author
Forward
0 new messages