Rails - ОК, чтобы установить переменную Rails внутри функции javascript? - PullRequest
3 голосов
/ 16 марта 2011

Что-то не так с установкой переменной Rails внутри функции javascript? Я не смог найти определенный ответ в Google и просто хотел убедиться, что в нем нет ни уловки, ни недостатка, о котором я не знаю. Я на самом деле не понимаю, как это работает вообще - если JavaScript выполняется на стороне клиента, я бы не предполагал, что Rails отреагирует на изменение переменной в представлении после того, как представление будет отображено ..?

(пример) У меня есть несколько функций, вызывающих одну и ту же форму, и мне нужно знать, какая функция вызывала формы для выполнения определенных задач в методе контроллера (сессия в этом случае - cookie, но я также пробовал локальные Rails переменная и она тоже работает).

<script type="text/javascript">

    $('.open_new_item_form' ).click(function(){
     alert('<%= session[:item_form_type]%>');
        <% session[:item_form_type] = "from_new_item_click" %>
     alert('<%= session[:item_form_type]%>');
        var url = $(this).attr("href");
        $.ajax({
etc...

Предупреждения указывают на то, что он работает хорошо. Он сообщит текущее значение и затем новое значение from_new_item после набора.

Спасибо - просто убедившись,

Ответы [ 3 ]

6 голосов
/ 16 марта 2011

Ваш файл erb полностью интерпретируется на сервере;эта строка будет выполняться как часть рендеринга javascript , а не при выполнении javascript на клиенте:

    <% session[:item_form_type] = "from_new_item_click" %>

Если поместить эту строку кода в блок javascript ifзначение false, ваши переменные на стороне сервера все равно будут изменены:

    if(0){<% session[:item_form_type] = "from_new_item_click" %>;}

(Простите мой pidgin -javascript, это не тот язык, на котором я говорю.)

1 голос
/ 16 марта 2011

Как сказали другие, ваше представление сначала отображается на сервере, а затем отправляется в браузер. К тому времени, когда он попадает в браузер, весь ваш код Ruby уже давно выполнен, и результатом этого является Javascript, который вы видите в браузере. Попробуйте посмотреть источник страницы в вашем браузере; Вы должны увидеть, что строка:

alert('<%= session[:item_form_type]%>');

уже заменено без кликов на:

alert('from_new_item_click');

Если вы действительно хотите изменить свой код RoR на стороне сервера, когда пользователь предпринимает какое-либо действие, вам необходимо использовать AJAX. По сути, AJAX позволяет вашему коду Javascript отправлять GET / POST на URL. Таким образом, в вашем обработчике событий .click вы можете нажать на URL, который вызывает действие, которое меняет любые переменные сеанса, которые вы хотите.

(Извините, если вы уже знаете все об AJAX; я подозреваю, что вы, возможно, не знаете его).

1 голос
/ 16 марта 2011

Частью процесса рендеринга для rails является оценка всего кода erb в этом представлении. Как только оценка кода будет завершена, rails отобразит файл (будь то javascript, html и т. Д.).

Поэтому, когда вы говорите, что вы удивлены, увидев, что рельсы могут реагировать на изменение переменной, это происходит потому, что на самом деле представление не было визуализировано в тот момент ... оно находилось в процессе рендеринга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...