Sea*_*yar 5 database null ruby-on-rails null-object-pattern
我什至不确定我是否有问题,但我只是不喜欢我的 text_fields 和 text_areas 保存在数据库中而empty string不是nil.
我正在使用空对象模式,刚刚意识到如果我创建一个配置文件但不填写位置字段然后调用<%= @user.profile.location.upcase %>它就不会爆炸,因为位置是一个字符串,即使它是空的。
这是 Rails 的惯例吗?如果是这样,那为什么呢?这有点奇怪,因为假设个人number_of_pets资料上有一个 attr,然后我尝试调用类似的东西
<% if user.profile.number_of_pets.odd? %>
<%= @user.profile.first_name %> has odd number of pets
<% end %>
Run Code Online (Sandbox Code Playgroud)
然后事情就爆发了,因为我无法打电话nil.odd?。
形式如常,所以如果不填写,将保存为空字符串
<%= form_for @profile, url: user_profile_path do |f| %>
<%= f.label :city %>
<%= f.text_field :location, class: 'form-control' %>
......
Run Code Online (Sandbox Code Playgroud)
最简单的解决方法是使用像“strip_attributes”这样的 gem,在这里找到:https://github.com/rmm5t/strip_attributes
可以通过before_save在模型中添加回调来完成自定义解决方法,该回调采用任何空白值并将它们设置回 nil。
以您的模型为例:
before_save :my_nil_maker_method_lol
[...]
def my_nil_maker_method_lol
if self.whatever_attribute.blank?
self.whatever_attribute=nil
end
end
Run Code Online (Sandbox Code Playgroud)
更新:
可以通过多种方法来防止保存空白字段,例如上述方法,甚至可以在控制器中的空白参数到达数据库之前将其删除。
在维护数据库完整性时,Rails 的方法是始终将此逻辑保留在模型中。它使维护变得更加容易,并且减少了意外的空间,例如您要在其他地方修改传入参数。
至于如何在模型中完成它实际上只是开发人员期望获得什么输入的问题。您可以添加如上所示的回调,以按照您认为合适的方式维护您的数据库,或者您可以添加一个validates_presence_of验证,如果该字段留空,则将向用户返回错误。
如果您询问是否应该阻止将空字符串插入数据库,这实际上取决于您作为开发人员,因为在某些情况下您可能需要该信息,但在这种情况下,听起来好像您正在寻求限制空字符串。
| 归档时间: |
|
| 查看次数: |
3910 次 |
| 最近记录: |