球写一段及其简单的 Ruby 代码

2016-12-08 17:20:29 +08:00
 wadezhao

用 Redmine 管理项目,是 Ruby 写的, Ruby 貌似在 Windows 下处理中文编码有点问题,导致 Redmine 中一些中文文件名的图片显示不正常,我找到解决方法但是不懂 Ruby ,请求帮忙。

需求很简单,下面这个函数是对字符串进行处理,处理后的字符串差不多是这样: /attachments/download/455/02%E5%AE.jpg 我想把最后一个“/”后面的字符删除,就是返回是 /attachments/download/455/ 应该很简单吧,函数如下:

def htmlesc( str, mode=:Quotes )
  if str
    str.gsub!( '&', '&' )
    str.gsub!( '"', '"' ) if mode != :NoQuotes
    str.gsub!( "'", ''' ) if mode == :Quotes
    str.gsub!( '<', '&lt;')
    str.gsub!( '>', '&gt;')
  end
  str
end
7645 次点击
所在节点    Ruby on Rails
30 条回复
doun
2016-12-08 23:49:05 +08:00
贴一下你的函数?
zhs227
2016-12-08 23:50:24 +08:00
你在不同的地方加一点输出,分段查看一下 url 的值。
lightening
2016-12-08 23:51:34 +08:00
这个 htmlesc 还用来出来 title ,见 `htmlesc title`。而且是直接改输入的,不依赖返回值。建议你还是不用动这个方法了。

`atts = " src=\"#{ htmlesc url.dup }\"#{ atts }"`
改成
`atts = " src=\"#{ File.dirname(htmlesc(url.dup)) }\"#{ atts }"`
liuhaotian
2016-12-09 08:15:42 +08:00
我觉得这个有点像是被 URLENCODE 了
是不是那个 method 出了问题
wadezhao
2016-12-09 11:16:03 +08:00
@lightening 这个方法我试过了,返回的是空(或者是'./'),很奇怪吧
wadezhao
2016-12-09 11:52:48 +08:00
@doun
@zhs227
@lightening
@liuhaotian

现在最奇怪的,是这样的。首先,我又做了一个函数:
def htmlesc_img( str, mode=:Quotes )
if str
str.gsub!( '&', '&amp;' )
str.gsub!( '"', '&quot;' ) if mode != :NoQuotes
str.gsub!( "'", '&#039;' ) if mode == :Quotes
str.gsub!( '<', '&lt;')
str.gsub!( '>', '&gt;')
end
str #这个地方我叫 [A 行]
end

然后把程序中这一句:
atts = " src=\"#{ htmlesc url.dup }\"#{ atts }"
改成
atts = " src=\"#{ htmlesc_img url.dup }\"#{ atts }" #这一行我叫 [B 行]


现在最诡异的情况在于:
1 ,如果 B 行我不改动,或者说 htmlesc_img 的代码和 htmlesc 完全相同,或者干脆把 htmlesc_img 这个处理函数去掉,则会返回
/attachments/download/455/02%E5%AE.jpg
说明: url.dup 这个变量是有值的,值是待处理的正常值

2 ,如果我把 A 行改为: File.dirname('/attachments/download/455/02%E5%AE.jpg'),可以正常输出
/attachments/download/455
这说明: atts 这个变量后续并没有被再处理,并且 File.dirname 这个函数执行的结果也是正常的

3 , A 行如果改成
v_temp = ''
v_temp = v_temp+ File.dirname(str)
或者
v_temp = File.dirname(str)
或者
File.dirname(str)
则返回的字符串是
. (就是一个点儿)

A 行如果改成
str.split("/")[0..-2].join("/")
则干脆返回一共空字符串

也就是说,无论我怎么改,也没办法在 htmlesc_img 这个函数内,把 str 这个变量处理,让这个函数返回正确的内容,这太诡异了…………
zhs227
2016-12-09 12:25:09 +08:00
直接用 log 吧,观察输出可能不靠谱。我测试过你这个函数一定是没有任何问题的

irb(main):001:0> def htmlesc_img( str, mode=:Quotes )
irb(main):002:1> if str
irb(main):003:2> str.gsub!( '&', '&amp;' )
irb(main):004:2> str.gsub!( '"', '&quot;' ) if mode != :NoQuotes
irb(main):005:2> str.gsub!( "'", '&#039;' ) if mode == :Quotes
irb(main):006:2> str.gsub!( '<', '&lt;')
irb(main):007:2> str.gsub!( '>', '&gt;')
irb(main):008:2> end
irb(main):009:1> File.dirname(str)
irb(main):010:1> end
=> :htmlesc_img
irb(main):011:0> htmlesc_img '/attachments/download/455/02%E5%AE.jpg'
=> "/attachments/download/455"

用日志或写文件方式,逐行记录,不可能这么诡异的
wadezhao
2016-12-09 12:35:10 +08:00
@zhs227 我怀疑是正斜杠和反斜杠的问题,很可能传进去的值是这样的?

\attachments\download\455\02%E5%AE.jpg'
wadezhao
2016-12-09 14:55:38 +08:00
我找到原因了,写回页面的代码应该在别的地方还有处理,一言难尽,但我知道大概问题在哪里了,也知道各位告诉我的 File.dirname 这个函数是可用的。

多谢各位,我继续解决问题了。 :)
wadezhao
2016-12-09 15:44:52 +08:00
解决了,原来 url 这个变量的值,就是'02%E5%AE.jpg',把前面的‘\attachments\download\455\’加上去,另有其他地方处理。

在 application_helper.rb 里有一个函数: parse_inline_attachments ,是在这里解析最终输出的字符串,其中解析图片 URL 的一行是这样的:
"src=\"#{image_url}\"#{alt}"

如楼上各位指点,这一行改成
"src=\"#{File.dirname(image_url)}\"#{alt}"

就达到我的目的了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/326236

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX