如何正确地允许nil in rails

时间:2017-08-21 21:38:26

标签: ruby-on-rails

在我的rails应用程序中,我的乐队有很多活动。在乐队看来,它可以显示他们有什么事件。我的问题是如果创建一个新的乐队,它将在视图中抛出一个错误,因为它没有事件。

我正在阅读有关allow_nil的内容,我想在我的乐队模型中使用它,但我不知道如何实现它。关于它的文档相当干燥,并没有真正的帮助

class Band < ApplicationRecord
    has_many :events :allow_nil true
end

我不确定上述方法是否正确。

2 个答案:

答案 0 :(得分:0)

Rails 5.x

我认为您正在寻找optional: true,但必须在协会的belongs_to方面添加,例如:

class Event < ApplicationRecord
  belongs_to :band, optional: true
end

Rails 4.x

Rails 4默认允许nil用于任何关联,您只需删除任何需要band_id存在的验证。

答案 1 :(得分:-1)

我怀疑你所要求的(相关型号的ActiveRecord级别数据验证)实际上并不是你的问题。您的原始问题是关于allow_nil,但您说明了(强调我的):

  

在乐队的视野中,它可以显示他们有什么事件。 我的问题是,如果创建了一个新乐队,它会在视图中引发错误,因为它没有事件。

您可能正在尝试通过使用.each迭代事件来显示事件列表,但由于事件集合不存在.each错误。相反,在你做之前:

<% events.each do |event| %> # or similar code that you're using 
   ...                       # to iterate over the collection
<% end %>

您应该检查events.present?

<% if band.events.present? %>
  <% band.events.each do |event| %>
    ...
  <% end %>
<% else %>
  # show something else
<% end %>

为了完整起见,allow_nil用于模型的特定字段,以便在该字段为零时跳过该字段的其他验证。 ([见这里的文件。])(http://edgeguides.rubyonrails.org/active_record_validations.html#allow-nil

它不适用于您在问题中发布的代码,因为您的event_id模型上没有Band字段 - 因为它是一对一 - 从BandEvents的多个关联(假设您正确设置了数据库)。