使用:before_save检查nil值

时间:2013-08-09 13:49:22

标签: ruby-on-rails ruby ruby-on-rails-2

在我看来,我在people内有organisation的下拉列表,可以分配票证。

<label for="assigned_support_id">Assigned To</label>
<%= select( "ticket", "assigned_support_id", Person.find_admin_and_support.collect {|p| ["#{p.name}", p.id]}, {:include_blank => "&lt; Unassigned &gt;"} ) %>

由于上面插入的空白没有值,如果选择了该选项,则故障单将保持分配给同一个人。

我考虑在数据库中创建一个“未分配”的人,但如果'人'属于每个组织,那可能会非常复杂....

我还考虑使用JavaScript来操作DOM并赋予它一个值,但我想这样做'Rails Way'所以我想出了以下内容:

ticket.rb

before_save :check_unassigned

...

private

def check_unassigned
  if self.assigned_support_id.nil? or defined?(self.assigned_support_id)
    self.assigned_support_id = 0
  end
end

nil检查似乎没有做任何事情,所以我添加了defined检查,但问题是,每次我将一张票重新分配给另一个用户时,该表将更新为0所以事情不太正确,我不确定这是什么错误。

我还考虑通过检查[:params] [:assigned_support_id]来更新控制器中的update方法,但认为以上是一个更简洁的解决方案。

2 个答案:

答案 0 :(得分:1)

如果存在salf.assigned_support_id,那么在'defined?'下它是真的......

所以您拥有的任何代码

if (some_irrelevant_evaluation) or defined?(self.assigned_support_id) 

总是评估为真。

答案 1 :(得分:0)

我愿意:

  if self.assigned_support_id.nil? or self.assigned_support_id.blank?

如果您选择空白选项并将其传回表单,则可能会传递空白字符串。

尝试将表单重新修改为以下内容:

<%= form_for @organization do |f| %>
    <%= f.label :assigned_support_id %>
    <%= f.collection_select(:assigned_support_id, Person.find_admin_and_support, :id, :name, {include_blank: "&lt; Unassigned &gt;"}) %>
<% end %>