我有一小段rails代码,可让用户输入评论。如果已经编写了一个,则显示当前评论,并带有编辑链接。
<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("text_area", "<form action=\"/pages/iphone-reviews/reviews/new/write\" class=\"edit_rating\" id=\"edit_rating_16\" method=\"post\"><div style=\"margin:0;padding:0\"><input name=\"_method\" type=\"hidden\" value=\"put\" /><input name=\"authenticity_token\" type=\"hidden\" value=\"fSZK30kpWEUtCxOvr4xDF1O+puDiPm87mhaxaLirIT8=\" /></div>\n <textarea cols=\"40\" id=\"rating_review\" name=\"rating[review]\" rows=\"20\" style=\"width:100%;height:150px;\">some text with "quotation marks"</textarea>\n</form>");
} catch (e) { alert('RJS error:\n\n' + e.toString()); alert('Element.update(\"text_area\", \"<form action=\\\"/pages/iphone-reviews/reviews/new/write\\\" class=\\\"edit_rating\\\" id=\\\"edit_rating_16\\\" method=\\\"post\\\"><div style=\\\"margin:0;padding:0\\\"><input name=\\\"_method\\\" type=\\\"hidden\\\" value=\\\"put\\\" /><input name=\\\"authenticity_token\\\" type=\\\"hidden\\\" value=\\\"fSZK30kpWEUtCxOvr4xDF1O+puDiPm87mhaxaLirIT8=\\\" /></div>\\n <textarea cols=\\\"40\\\" id=\\\"rating_review\\\" name=\\\"rating[review]\\\" rows=\\\"20\\\" style=\\\"width:100%;height:150px;\\\">some text with "quotation marks"</textarea>\\n</form>\");'); throw e }; return false;">Edit Review</a>
</div>
此示例中断,因为评论文本包含双引号。它适用于单引号和我能想到的任何其他文本。我认为rails并没有在javascript中正确地转义双引号。
Firebug中出现的错误是:
缺少)参数列表后 [打破此错误] \“id = \”rating_review \“name = \”rating [re ... n:right; \“&gt; \ n
我对如何解决这个问题感到茫然。谢谢!
答案 0 :(得分:1)
找到一个有效的解决方案。我不确定它为什么会起作用,但确实如此。
在上面几次我调用部分渲染文本区域和表单,用户可以在其中编辑他们的评论,如下所示
<%= 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函数中可以改进的东西。
答案 1 :(得分:0)
你可以写一个javascript逃生助手:
def escape_javascript(javascript)
javascript.gsub!("\r\n", "\\n")
javascript.gsub!(/\n|\r/, "\\n")
javascript.gsub(/["']/) {|m| "\\#{m}"} || javascript
end
并在保存评论时调用它。