Rails Ransack 不支持中文选项怎么办?输出的 HTML 都是一样的,把中文直接 cut 掉了

xlaok · 2016年05月05日 · 最后由 qinfanpeng 回复于 2016年05月06日 · 2204 次阅读
<%= f.collection_radio_buttons :detail_of_WatchDetail_type_shell_material_eq,
            condition[:options],
            lambda { |h| h[:name] },
            lambda { |h| h[:name] }%>

condition[:options] hash 的条件,key 和 value 都是 中文 [ {name: 长款}, {name: 短款}] 这样的

渲染出的 radio 都是

<span class="item">
  <label for="q_detail_of_WatchDetail_type_shell_material_eq_">
    <input type="radio" value="长款" name="q[detail_of_WatchDetail_type_shell_material_eq]" id="q_detail_of_WatchDetail_type_shell_material_eq_">
    <label class="collection_radio_buttons" for="q_detail_of_WatchDetail_type_shell_material_eq_">长款</label>
  </label>
</span>

渲染出的 id 和 for 都是 q_detail_of_WatchDetail_type_shell_material_eq_ 而不是 q_detail_of_WatchDetail_type_shell_material_eq_长款 等

导致无法点击到对应选项,这种情况怎么解决呢?

感觉你这里设计上也有问题,理论上说不应该让中文出现在 id、for 等属性中

遇到过这个问题,明天给你在以前的项目看看

#1 楼 @qinfanpeng 嗯,但是没办法,如果直接搜中文就会这样。

#2 楼 @kikyous 感谢先送上!

在 config/initializers 新增一个文件 action_view_cjk.rb

module ActionView::Helpers::Tags
  class Base
     def sanitized_value(value)
        #value.to_s.gsub(/\s/, "_").gsub(/[^-\w]/, "").downcase
        value.to_s.gsub(/\s/, "_").gsub(/[^-\p{L}]/, "").downcase
     end
  end
end

#5 楼 @kikyous 可行,原来是 action_view 的问题,错怪 ransack 了

或许我应该发一个 PR 给 rails,因为根据 w3c 的定义,属性值是支持 cjk 字符的

补充一点:其中的 /\p{L}/ 称为 Character Properties,比如:

/\p{Han}/   # 汉字
/\p{L}/ - 'Letter'

#8 楼 @qinfanpeng #7 楼 @kikyous 我试了下汉子好的,但是数字又被 cut 不输出了,有没有同时输出汉子,数字,英文不 cut 的方案?

#9 楼 @xlaok

value.to_s.gsub(/\s/, "_").gsub(/[^-\d\p{L}]/, "").downcase

其实就是个正则表达式而已

value.to_s.gsub(/\s/, "_").gsub(/[^-\p{Word}]/, "").downcase

这样应该也可以

需要 登录 后方可回复, 如果你还没有账号请 注册新账号