Передача объектов из Rails RJS в вызов функции JavaScript без кавычек значений? - PullRequest
2 голосов
/ 01 августа 2009

В проекте Ruby on Rails мне нужно иметь функцию JavaScript, выполняемую в конце вызова Ajax. Моя проблема в том, что значения, передаваемые в функцию JavaScript, вызываемую с помощью page.call, заключаются в кавычки. Не слишком большая проблема, если вы передаете строки, но одним из значений является строковое представление массива JavaScript, т.е. [0,1,2,3].

Вот что я считаю важными фрагментами кода.

У меня есть поле наблюдения, которое просматривает выпадающий список выбора.

<%= observe_field("project_select_list",
    :loading => "Element.show('tree_indicator')",
    :complete => "Element.hide('tree_indicator')",
    :url => {:controller => "projects", :action => "change_project"},
    :with => "id")
%>

В контроллере проекта

def change_project()
    @current_project = Project.find(params[:id])
end

А в change_project.rjs

page.replace_html("project_name", @current_project.name)
page.visual_effect(:highlight, "project_name")
page.call("buildYUITreeView", "project_tree", @current_project.get_directory_contents(@current_project.local_path, 0))

Последнее значение:

@current_project.get_directory_contents(@current_project.local_path, 0))

это то, что вызывает у меня проблемы. Я просто хочу, чтобы он отправил значение, например [0,1,2,3], но он отправляет «[0,1,2,3]», что приводит к взрыву JS.

Этот частичный код выполняет то, что должен: он отправляет данные, а не строку в код JavaScript, который помещается на страницу.

<% javascript_tag do -%>
    YAHOO.util.Event.addListener("dom:loaded", "load", buildYUITreeView("<%= tree_id %>", <%= project.get_directory_contents(project.local_path, 0) %>));
<% end -%>

Имея это в виду, я играю с использованием партиала и просто рендеринг его для вызова функции JS, когда мне нужно, но это похоже на такой взлом.

Как сделать так, чтобы page.call не заключал в кавычки данные, отправленные в качестве параметров, или как мне передать эти данные в функцию JS для выполнения после завершения вызова Ajax?

Ответы [ 2 ]

4 голосов
/ 03 августа 2009

Том был на правильном пути, метод << - это путь, потому что он вставит любой javascript напрямую. Вы захотите использовать это вместо call.

page << "buildUYITreeView('project_tree', #{@current_project.get_directory_contents(@current_project.local_path, 0))})"

Вы можете сделать то же самое со строкой YAHOO, как показала Том, которая должна быть более эффективной, чем использование частичного с тегом javascript.

1 голос
/ 02 августа 2009

Вместо этого вы можете использовать метод

page << 'YAHOO.util.Event.addListener("dom:loaded", "load", buildYUITreeView("project_tree", '+@current_project.get_directory_contents(@current_project.local_path, 0)+'))'
...