【问题标题】:Rails: form fields saving to database defaults to empty instead of nilRails:保存到数据库的表单字段默认为空而不是 nil
【发布时间】:2017-03-31 08:14:39
【问题描述】:

据我了解,保存到数据库的空表单字段通常默认为 nil(这是我想要的)。但是我的两个可选表单字段保存为空(“”)而不是 nil。

我不确定这是为什么,我查看了:Understanding Rails validation: what does allow_blank do?Save blank value as nil in database 认为这可能是因为我使用的是 allow_blank: true

我的组.rb

# meetup_urlname must be unique
validates :meetup_urlname, uniqueness: { case_sensitive: false, message: "this is already being used by a different group" }, allow_blank: true


# only validate if meetup_apikey or if meetup_urlname is non-empty
validate :url_name_valid?, :if => :meetup_urlname?
validate :api_key_valid?, :if => :meetup_apikey?

_Form.html.erb:

<%= bootstrap_form_for(@group, :html => { :multipart => true }, layout: :horizontal, label_col: "col-sm-3", control_col: "col-sm-9") do |f| %>
... 
  <h5>Import Events from Meetup</h5>

  <div class="field">
    <%= f.text_field :meetup_urlname, label: "Meetup Group's URL", type: "text", placeholder: "Enter your Meetup group's url to retrieve your events", prepend: 'http://www.meetup.com/'  %>
  </div>

  <div class="field">
    <%= f.text_field :meetup_apikey, label: 'Meetup API Key', placeholder: 'Enter your Meetup API key  (Required for advanced meetup functionality)' %>
  </div>

<%= f.hidden_field :status %>
<%= f.hidden_field :audit_status %>
<%= f.hidden_field :sref %>

<div class="col-sm-10" style="padding-right: 26px;">
  <div class="actions pull-right">
    <%= f.submit 'Update Group', class: "action-btn btn-rounded btn-large" %>
  </div>
</div>

<% end %>

有没有办法让可选的表单字段默认保存为 nil 而不是空的?目前有一个技巧,如果表单字段返回为空..它将覆盖为 nil。

任何反馈或见解都会有所帮助。谢谢!

【问题讨论】:

  • 为什么允许空白?通常禁用它以避免这个问题。
  • @tadman,对不起,我想这是我想添加可选表单字段的一种方式,但如果在表单字段中输入了某些内容,仍然需要验证。我不知道是否可以使用其他东西来允许该字段是可选的。将 if 语句传递给 validates :meetup_urlname 是否更好?
  • 如果您愿意,您可以随时将 if 逻辑推入验证器本身。 if 子句通常更适合那些没有像 validates ..., presence: true, if: ... 这样的关联方法的人

标签: ruby-on-rails ruby database forms


【解决方案1】:

strip_attributes gem 可以为您解决这个问题。

https://github.com/rmm5t/strip_attributes

【讨论】:

  • 这个 gem 似乎对我有用,但它也可以做其他事情,我不确定它是否会在其他地方破坏我的应用程序。是否有另一种方法可以在可选表单字段中写入仅在满足条件时进行验证?谢谢。
【解决方案2】:

您能发布更多上下文吗?

根据我们目前的情况,我的想法是:

  1. "" 来自视图中的某处(请粘贴)
  2. 也许您在:meetup_urlname 上的某个地方拨打to_snil.to_s 将在 ruby​​ 中返回 ""

【讨论】:

  • 这很有趣.. 我认为这可能是它保存为空的原因。我已经从视图中发布了我的_form.html.erb,但我认为它没有问题。没有在任何地方打电话给to_s meetup_urlnamemeetup_apikey
猜你喜欢
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
相关资源
最近更新 更多