我甚至不确定我是否有问题,但我只是不喜欢把我的text_fields和text_areas作为empty string而不是nil保存在数据库中。
我正在处理空对象模式,并且刚刚意识到如果我创建了一个配置文件,但是不要填充location字段,然后调用<%= @user.profile.location.upcase %>,那么它就不会爆炸,因为location是一个字符串,即使它是空的。
这是rails的惯例吗?如果是,那为什么?这有点奇怪,因为在配置文件上有一个number_of_pets攻击,然后我尝试调用类似的
<% if user.profile.number_of_pets.odd? %>
<%= @user.profile.first_name %> has odd number of pets
<% end %>因为我不能打电话给nil.odd?,所以爆炸了。
窗体,因此如果未填充,它将保存为空字符串。
<%= form_for @profile, url: user_profile_path do |f| %>
<%= f.label :city %>
<%= f.text_field :location, class: 'form-control' %>
......发布于 2016-05-13 13:49:42
我说的是我所观察到的,也许不一定是Rails的惯例。
例如,当我们执行rails g post title content:text时,您可能记得它没有包含标题(字符串)和内容(文本)的default: ''。对于我来说,这已经是一个提示:没有Rails--关于这一点的约定,或者具体地说,默认情况下,每个属性都被允许为NULL或no。
使用NULL的优点是可以识别哪些记录设置了这些属性。
假设我们有一个API服务器。如果客户端为我们的API服务器创建了一个post,我们就知道哪些属性要具有一个值。让我们这样说:
客户-1的贴子:
post: {title: 'Foo bar'}Post(title: 'Foo bar', content: nil)。Post(title: 'Foo bar', content: '')客户-2的职位配对:
post: {title: 'Foo bar', content: ''}Post(title: 'Foo bar', content: '')。Post(title: 'Foo bar', content: '')请注意,如果我们有默认值:'',那么我们就无法知道客户机实际上是否打算拥有一个空的content值,因为对于client-1和client-2,post的结果content值无论如何都是'‘(空的)。但是,如果我们有空允许的属性,那么我们仍然可以通过不传递参数中的属性来识别客户机是否打算不具有content值。这是一个重要的用例。
根据您的项目和属性的用途,您可以使用NULL允许,也可以为该属性设置默认的空字符串。
现在,您遇到的NULL允许的一个主要问题是,您无法保证每个值都是String,因此,如果location为NULL或NULL,则location将引发错误。
这可能有点烦人,特别是如果您有像您的示例这样的一系列方法的话。
<%= @user.profile.location.upcase.downcase %>如果@user.profile.location为零,这将是一个问题,因为您必须优雅地确保它不会引发错误。如果@user.profile是零,这也是一个问题(假设您允许@user.profile为零)。通常情况下,您将执行以下操作来完成此任务:
<% if !@user.profile.nil? && !@user.profile.location.nil? %>
<%= @user.profile.location.upcase.downcase %>
<% end %>只要您有更长的链接方法,以确保它不会引发任何错误,if条件仍然可以继续。
使用.try()可能会“清理”这个问题。我经常使用这个,特别是在模板文件中。解决方案将像下面这样更干净,尽管可能会让那些不知道的人感到困惑:
<%= @user.profile.try(:location).try(:upcase).try(:downcase) %>如果.location或.upcase为零,则返回零,不再引发任何undefined method ... for NilClass。
https://stackoverflow.com/questions/37209611
复制相似问题