Ребят, чувствую что где-то ступил, а понять не могу где.
В коде страницы использую link_to_remote ...
В коде RJS использую page.replace_html ...
Запрос нормально уходит, ответ нормально генерится, id элементов
совпадают.
НО: вместо того чтобы обновить содержимое указанного элемента на
контент сгенеренный partials, я получаю в содержимом элемента:
Element.update("pages_6", "[здесь нужный мне контент]")....
т.е. оно прямо так и выводится, а не обрабатывается javascript'oм.
Где я ступил?
--
Александр Орел
у вас что-то типа
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
В 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 - нет.
Где оно, утреннее просветление?
--
Орел Александр
Прочел раз 10. Просветление не наступает. Вроде делаю все как в
документации и примерах.
Удалил ключ :update => 'pro' - заработало. Но почему??
P.S. Угу, поток сознания, да.
Понятно, что когда ставишь "апдейт", то он тупо ждет, что ты ему
пришлешь контент, которым надо апдейтить. Если там будет яваскрипт, то
он его и всунет (выполнять не будет). Насколько я помню, там по
умолчанию стоит 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;
Спасибо за пинок в нужном направлении!
--
Александр Орел
Как это понял я (если не прав - поправьте!):
1. Если мы ставим ключ :update, то тем самым указываем на стороне
принимающего html, что содержимое конкретного элемента надо заменить
на то, то вернется в результате AJAX запроса.
2. Если мы ключ :update не ставим, то мы интерпретируем пришедший
ответ как JS. Таким образом, что надо сделать со страницей (например
какой элемент обновить) определяется только на стороне сервера.
Какая там документация ?!
1. Смотришь, какой яваскрипт генерят разные рельсовые хелперы.
2. Смотришь, что делают яваскрипт объекты, которые вызывают хелперы.
Да вообщем-то в основном api.rubyonrails.org, AWDwR, плюс найденное в
гугле по теме (довольно мало нашлось так чтобы с объяснением _как_ это
работает и самое главное в чем разница вызовов, я бы сказал "ничего"),
ну и метод тыка.
--
Alexander Oryol