2013-08-09 5 views
2

На мой взгляд у меня есть выпадающий список people в пределах organisation, которому может быть назначен билет.Проверка нулевого значения с использованием: before_save

<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 CHEC k, похоже, ничего не сделал, поэтому я добавил defined, но проблема в том, что каждый раз, когда я переназначаю билет другому пользователю, таблица будет обновляться с 0, поэтому что-то не так, и я не уверен, что это за ошибка.

Я также рассмотрел вопрос об обновлении метода update в своем контроллере, проверив [: params] [: assign_support_id], но считал, что это вышеописанное решение.

+0

можно непосредственно использовать 'self.assigned_support_id || = 0 '(если' self.assigned_support_id' является 'nil' он будет установлен в ноль) и вам не нужно тестировать .nil? и определяется? – MrYoshiji

+0

спасибо, он почти работает, ведет себя правильно при переходе от неназначенного к назначенному человеку, но при переходе от назначенного к неназначенному значение db не заполняется 0. – martincarlin87

+0

Почему вы не хотите использовать 'nil' в своей базе данных? – ctilley79

ответ

1

Если salf.assigned_support_id существует, то это правда, под "определяется? ...

поэтому любой код, где у вас есть

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

ВСЕГДА будет вычисляться так.

+0

спасибо, но любая идея о том, как добиться того, что я ищу? – martincarlin87

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 %> 
+0

спасибо, просто попробовал, но при выборе пустой опции идентификатор в таблице остается таким же, как и раньше. – martincarlin87

+0

Вам все равно придется обрабатывать логику вставки для того, что вы пытаетесь сделать. Но это будет означать, если выбран пустой параметр. – Drew

+0

да, у меня есть это 'def check_unassigned , если self.assigned_support_id.nil? или self.assigned_support_id.blank? self.assigned_support_id = 0 конец конец'. Теперь используйте 0, чтобы проверить, работает ли он. – martincarlin87

Смежные вопросы