Rails 5.2-在字段中检测内容类型

时间:2019-02-17 03:37:54

标签: ruby-on-rails

允许用户上传CSV,然后输出一个CSV示例供他们验证。为此,我想在其旁边添加“猜测”字段类型(字符串,数字等-高级)。

当前我正在使用:

查看

<p>
  <strong>Spec Sheet SAMPLE (Live Data):</strong>
    <%#= image_tag url_for(@post.cover_photo) %>
    <% preview_data = CSV.foreach(ActiveStorage::Blob.service.send(:path_for, @post.cover_photo.blob.key)).take(10) %>
    <table style="width:50%">
      <tr>
        <% preview_data[0].each do |header| %>
          <th><%= header %> </th>
        <% end %>
      </tr>
          <% preview_data.drop(1).each do |row| %>
            <tr>
              <% row.each do |info| %>
                <td><%= info %> <%= type_sense(info) %></td>
              <% end %>
            </tr>
          <% end %>
    </table>
</p>

控制器

def type_sense(content)
  if content.is_a? Integer
    return 'Number' 
  elsif content.is_a? String
    return 'Text'
  end
end

helper_method :type_sense  

我了解到-从技术上讲,通过CSV制作的数组中的所有内容都是字符串。

我注意到,文件上传后,所有内容都被双引号引起了,我假设尽管它被还原为原始值,但仍将其转换为字符串。

注意我确实知道它会错误地将某些内容标记为其他内容,但是对于此测试用例,我只是想让它将9位数字注册为“整数”,并将字母注册为“文本” '。

1 个答案:

答案 0 :(得分:1)

您可以使用正则表达式:

def type_sense(content)
  case content
  when /\A\d+\z/ then 'Number' #matches a string with only digits in it 
  else 'Text' #if it's not a number, then it's text, I guess you want to count "some123thing" as text
  end
end

如果您只想将字母(和空格?)记为“文本”,请使用

when /\A\d+\z/ then 'Number' #matches a string with only digits in it 
when /\A[a-zA-Z\s]+\z/ then 'Text'
else 'Unknown'

如果您需要不同的内容(例如日期,电话号码或任何具有某种模式的东西),则可以使用不同的正则表达式进行播放