#ruby-on-rails-3
#ruby-on-rails-3
Вопрос:
когда пользователь нажимает на ссылку «Мой дисплей», он переходит на страницу «Мой дисплей», после загрузки страницы запускается javascript для отображения. что-то вроде приведенного ниже:
...
display_data_hash = {}
function display() {
// use display_data_hash here
}
...
возможно ли заполнить «display_data_hash» в моем javascript на стороне сервера? или я должен просто добавить тег в свое представление и заполнить display_data_hash внутри моего html. я действительно не хочу смешивать javascript с html.
Ответ №1:
Первый подход с использованием AJAX
вы могли бы получить свой display_data_hash с помощью AJAX (jQuery здесь), например:
$.getJSON('/yourcontroller/youraction.json', function(data) {
display(data);
});
и в вашем контроллере вы выводите ответ json, подобный:
class YourController < ApplicationController
def your_display_action
@my_data = .....
respond_to do |format|
format.json{ render :json => @my_data }
end
end
end
Второй подход без AJAX
Если вы не хотите запускать AJAX-запрос, вы могли бы сделать что-то вроде:
В вашем представлении макета добавьте раздел:
<html>
<head>
....
<script type="text/javascript">
<%= yield :inline_js %>
</script>
....
</head>
<body>
....
</body>
</html>
затем создайте вспомогательный метод, подобный:
def insert_display_data(display_data) {
# convert hash to json
data_json = display_data.to_json
content_for :inline_js do
"display('#{data_json}');"
end
}
и в вашей функции отображения JavaScript выполните:
function display(data) {
if(data instanceof String) {
// parse JSON using jquery
data = $.parseJSON(data);
}
// your code...
}
Комментарии:
1. спасибо sled. зачем мне нужно выполнять вызов AJAX? когда я вызываю свой контроллер отображения, он должен возвращать html и javascript, я просто хочу, чтобы сервер заполнил мой display_data_hash в моем javascript.
2. привет, тогда перейдите ко второму решению, используя content_for и вспомогательную функцию
![]()
3. спасибо за код, он полезен. я предполагаю, что нет способа динамически обновлять javascript без участия html, единственное решение — изменить содержимое тега <script> в html.
4. это совершенно нормально, если вы делаете это чистым способом. Проблема в том, что синтаксис хэша ruby и хэша javascript отличается. Поэтому вы можете передать свой хэш в виде json и проанализировать его в своей JS-функции в хэш javascript. Вы должны поместить хэш ваших данных куда-нибудь в свой html-код, иначе он не дойдет до клиента
![]()