2014-10-23 3 views
-1

У меня есть такой сценарий в моем html.erb:Javascript «если оператор» и встроенный рубин (переменный рубин всегда верно)

if(browser == "Firefox") { 
    $(".browser-warning").show(); 
} 

else if(browser == "Safari") { 
    if(browser.version < 6) { 
    $(".browser-warning").show(); 
    } 
} 

else if((BrowserDetect.browser != "Chrome") && (<%= params[:section_id].to_s %> != '')) { 
    console.log('yo'); 
    <%= session[:is_chrome] = false %> 
    <%= Rails.logger.debug = "I made is_chrome false, wtf?" %> 
} 

else { 
    $(".browser-warning").show(); 
} 

Я бег этого сценария из браузера и условия Chrome возвращает ложные.

но сеанс [: is_chrome] всегда становится ложным и возвращает рекордер Rails «Я сделал is_chrome false, wtf?». НО. JS-консоль не печатает «yo» в консоли. Почему это так и как правильно определить значение сеанса только в том случае, если утверждение JS «if» истинно?

Спасибо, все.

+0

Вы пытаетесь оценить что-то на сервере на основе значения на клиенте? – Mathletics

+0

@ Математика да, я. –

+2

Да, вы не можете этого сделать, понимаете? Поскольку Ruby уже был оценен сервером к моменту запуска JS в браузере. – Mathletics

ответ

3

на сервере при визуализации шаблона каждый рубин фрагмент получает оценку
Таким образом, эти строки выполняются на сервере (каждый раз, не только если это не браузер Chrome):

<%= session[:is_chrome] = false %> 
<%= Rails.logger.debug = "I made is_chrome false, wtf?" %> 

Чтобы обойти это, вы можете сделать одно следующее:

  • Проверка на сервере если это хром браузер и сделать необходимые изменения
  • Проверка на стороне клиента если это хром браузер сделать АЯКС вызова к серверу, чтобы сообщить, что есть хром (или не хром) браузера


Кроме того поставил <%= params[:section_id].to_s %> в кавычки (как пользователь «настоянный» также указано):

"<%= params[:section_id].to_s %>" 
0

Вы должны поставить кавычки выхода Ruby:

"<%= params[:section_id].to_s %>" 
2

Вы должны понимать, что рельсы оказывает Erbs, прежде чем они не отправить в браузер, и там никаких заявлений Еврорадио, когда Javascript работает его код. Кроме того, когда рельсы оказывает файл, он обрабатывает все не окруженную <%%> в виде чистого текста, так как

<%= session[:is_chrome] = false %> 
<%= Rails.logger.debug = "I made is_chrome false, wtf?" %> 

всегда выполняются, независимо от того, какой яваскрипта код написан вокруг них.

Если вы хотите выполнить какой-либо клиентский код на стороне сервера, единственный способ сделать это - отправить другой запрос (через Ajax, простой вариант) или использовать socketIO для включения взаимодействия клиент-сервер (никогда не делал этого сам :()

Однако то, что вы пытаетесь достичь, можно достичь исключительно на стороне сервера:. посмотреть на this question

+0

спасибо, мужчина. слишком нубийский вопрос ( – TiSer

Смежные вопросы