Rails, выходящие из кавычек в частичном link_to_function - PullRequest
0 голосов
/ 11 мая 2009

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

      <div id="text_area">
        <% if @user_rating.review.blank? %>
          <%= render :partial => "reviews/text_area" %>
        <% else %>
          <%= simple_format @user_rating.review %>
          <%= link_to_function "Edit Review" do |page|
            page.replace_html :text_area, :partial => "reviews/text_area"
          end %>
        <% end %>
      </div>

Это работает правильно, КРОМЕ, если обзор содержит символ двойной кавычки. Вот вывод HTML, который он генерирует после того, как пользователь уже написал отзыв (блок else сверху).

      <div id="text_area">
          <p>some text with "quotation marks"</p>
          <a href="#" onclick="try {
Element.update(&quot;text_area&quot;, &quot;&lt;form action=\&quot;/pages/iphone-reviews/reviews/new/write\&quot; class=\&quot;edit_rating\&quot; id=\&quot;edit_rating_16\&quot; method=\&quot;post\&quot;&gt;&lt;div style=\&quot;margin:0;padding:0\&quot;&gt;&lt;input name=\&quot;_method\&quot; type=\&quot;hidden\&quot; value=\&quot;put\&quot; /&gt;&lt;input name=\&quot;authenticity_token\&quot; type=\&quot;hidden\&quot; value=\&quot;fSZK30kpWEUtCxOvr4xDF1O+puDiPm87mhaxaLirIT8=\&quot; /&gt;&lt;/div&gt;\n        &lt;textarea cols=\&quot;40\&quot; id=\&quot;rating_review\&quot; name=\&quot;rating[review]\&quot; rows=\&quot;20\&quot; style=\&quot;width:100%;height:150px;\&quot;&gt;some text with &quot;quotation marks&quot;&lt;/textarea&gt;\n&lt;/form&gt;&quot;);
} catch (e) { alert('RJS error:\n\n' + e.toString()); alert('Element.update(\&quot;text_area\&quot;, \&quot;&lt;form action=\\\&quot;/pages/iphone-reviews/reviews/new/write\\\&quot; class=\\\&quot;edit_rating\\\&quot; id=\\\&quot;edit_rating_16\\\&quot; method=\\\&quot;post\\\&quot;&gt;&lt;div style=\\\&quot;margin:0;padding:0\\\&quot;&gt;&lt;input name=\\\&quot;_method\\\&quot; type=\\\&quot;hidden\\\&quot; value=\\\&quot;put\\\&quot; /&gt;&lt;input name=\\\&quot;authenticity_token\\\&quot; type=\\\&quot;hidden\\\&quot; value=\\\&quot;fSZK30kpWEUtCxOvr4xDF1O+puDiPm87mhaxaLirIT8=\\\&quot; /&gt;&lt;/div&gt;\\n        &lt;textarea cols=\\\&quot;40\\\&quot; id=\\\&quot;rating_review\\\&quot; name=\\\&quot;rating[review]\\\&quot; rows=\\\&quot;20\\\&quot; style=\\\&quot;width:100%;height:150px;\\\&quot;&gt;some text with &quot;quotation marks&quot;&lt;/textarea&gt;\\n&lt;/form&gt;\&quot;);'); throw e }; return false;">Edit Review</a>

      </div>

Этот пример разбивается, потому что текст обзора содержит двойные кавычки. Он работает с одинарными кавычками и любым другим текстом, который я могу придумать. Я думаю, что rails неправильно избегает двойных кавычек в javascript.

Ошибка, возникающая в Firebug, такова:

отсутствует) после списка аргументов [Прервать эту ошибку] ​​\ "id = \" rating_review \ "name = \" rating [re ... n: right; \ "> \ n

Я не знаю, как это исправить. Спасибо!

Ответы [ 2 ]

1 голос
/ 23 мая 2009

Нашел решение, которое сработало. Я не совсем уверен, почему это сработало, но это сработало.

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

<%= render :partial => "reviews/text_area" %>

Все, что мне нужно было сделать, это войти и отредактировать этот фрагмент. Одна из строчек в форме выглядела так:

<%= f.text_area :review %>

Все, что я сделал, это изменил это на:

<textarea cols="40" id="rating_review" name="rating[review]" rows="20"><%=@user_rating.review%></textarea>

По сути, просто вставьте его вручную, чтобы он не использовал функцию rails для генерации текстовой области. По какой-то причине это работает сейчас. Может быть что-то, что может быть улучшено в функции rails text_area.

0 голосов
/ 11 мая 2009

Вы можете написать Javascript escape-помощник:

def escape_javascript(javascript)
        javascript.gsub!("\r\n", "\\n")
        javascript.gsub!(/\n|\r/, "\\n")
        javascript.gsub(/["']/) {|m| "\\#{m}"} || javascript
end

и позвоните, когда сохраните свой отзыв.

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