0

В нашем Rails 3.2.13 приложения, мы имеем этот код в одном из наших взглядов Еврорадио:Струны быть некстати спаслась, когда введен в текстовые поля

<script language="javascript"> 
function copy_address() 
{ 
    document.getElementById("account_firm_name").value = '<%= escape_javascript firm_name %>'; 
    document.getElementById("account_address_line_1").value = '<%= escape_javascript address %>'; 
    document.getElementById("account_city").value = '<%= escape_javascript city %>'; 
    document.getElementById("account_state_id").value = '<%= escape_javascript state_id.to_s %>'; 
    document.getElementById("account_zip_code").value = '<%= escape_javascript zip %>'; 
} 
</script> 

<%# snip %> 

<%= form_tag %> 
    <table> 
    <tr class="two_columns"> 
     <td><label for="firm_name">Firm Name*</label></td> 
     <td><%= text_field 'account', 'firm_name' %></td> 
    </tr> 
    <%# snip %> 
    </table> 
</form> 

Это форма Rails и функция JS, которая копирует некоторые известные значения в форму.

Если есть какие-либо специальные символы в firm_name, address, city или zip строк, которые вводятся с помощью Еврорадио, они неподобающим HTML убежали. Например, если firm_name = '&', то генерируется HTML-включает в себя функцию JS:

<script language="javascript"> 
function copy_address() 
{ 
    document.getElementById("account_firm_name").value = '&amp;'; 
    // snip 

и выполнение функции вставляет строку &amp; (не &) в соответствующее текстовое поле в форме.

Есть ли безопасный способ избежать того, чтобы ERB избежал значений строк или способа использования JavaScript, чтобы избежать использования строк, прежде чем помещать их в текстовые поля?

(До сих пор, я попытался с помощью .html_safe и raw Rails методы, но не кости.)

+1

Как насчет печати JSON-кодированного объекта, а затем использовать его в JavaScript? – elclanrs

+0

Не могли бы вы использовать 'sanitize' в контроллере, тогда вам не нужно было бы' escape_javascript' в представлении –

+0

@n_i_c_k: Недавно я добавил 'escape_javascript', пытаясь заставить его работать. Поведение одинаково без этих вызовов. – Kevin

ответ

0

I понял, что в другом месте на вид у нас был этот код:

<% firm_name = h(@agency.name) %> 
<% address = h(@agency.address) %> 
<% city = h(@agency.city) %> 
<% state_id = @agency.state_id %> 
<% zip = h(@agency.zip_code) %> 

Если вы «У меня такая же проблема, как и я, убедитесь, что у вас нет кода, предварительно избегающего строк, которые вы хотите использовать.

Я закончил с использованием этого кода:

function copy_address() 
{ 
    document.getElementById("account_firm_name").value = '<%= raw (escape_javascript @agency.name) %>'; 
    document.getElementById("account_address_line_1").value = '<%= raw (escape_javascript @agency.address) %>'; 
    document.getElementById("account_city").value = '<%= raw (escape_javascript @agency.city) %>'; 
    document.getElementById("account_state_id").value = '<%= raw (escape_javascript (@agency.state_id.to_s)) %>'; 
    document.getElementById("account_zip_code").value = '<%= raw (escape_javascript @agency.zip_code) %>'; 
} 

используя @agency атрибуты непосредственно, прежде чем они были пробежать h().

0

Я столкнулся с той же проблемой при попытке динамически устанавливать страницы только элемент заголовка. Я в конечном итоге решить, какие символы я хотел проверить и просто делать gsub в помощник вида, как так:

в application_helper.rb

def title_sanitize(string) 
    sanitize(string).gsub('&amp;', '&').html_safe 
end 

Затем на ваш взгляд

document.getElementById("account_firm_name").value = '<%= title_sanitize(firm_name) %>'; 
Смежные вопросы