Перемещение бизнес-правил в модель - PullRequest
1 голос
/ 23 января 2009

Я задал вопрос ранее, который вызвал несколько хороших ответов.

Вот предыдущий вопрос

На основании некоторых советов, приведенных там, я попытался переместить следующую логику контроллера

 if params[:concept][:consulted_legal] == 0 && params[:concept][:consulted_marketing] == 1
  @concept.attributes = {:status => 'Awaiting Compliance Approval'}
elsif params[:concept][:consulted_marketing] == 0 && params[:concept][:consulted_legal] == 1 
  @concept.attributes = {:status => 'Awaiting Marketing Approval'}
elsif params[:concept][:consulted_marketing] == 0 && params[:concept][:consulted_legal] == 0
  @concept.attributes = {:status => 'Awaiting Marketing & Legal Approval'}
else
  @concept.attributes = {:status => 'Pending Approval'}
end

в модель, вот так:

def set_status
if status.blank?
  if (consulted_legal == true) && (consulted_marketing == true)
      status = "Pending Approval"
  elsif (consulted_legal == true) && (consulted_marketing == false)
    status = "Awaiting Marketing Approval"
  elsif (consulted_legal == false) && (consulted_marketing == true)
    status = "Awaiting Legal Approval"
  elsif (consulted_legal == false) && (consulted_marketing == false)
    status = "Awaiting Marketing & Legal Approval"
  end
end
true # Needs to return true for the update to go through    
  end

Я звоню с обратного вызова before_save.

По умолчанию оба атрибута consulted_legal и consulted_marketing установлены в значение false, а не в null, поэтому я проверяю здесь == false или true вместо запроса

if consulted_legal?

например.

Однако эта логика, похоже, не работает. Если я осматриваю объект, статус не устанавливается ни на что, никогда. Кто-нибудь может определить, почему это может происходить? Я правильно понял, например, как неправильно поступают атрибуты в моделях?

ТИА

Ответы [ 2 ]

6 голосов
/ 23 января 2009

Вместо status = попробуйте self.status =. Я обнаружил, что мне нужно было использовать self. для изменения атрибута модели внутри модели.

Также гораздо лучше иметь errors.empty? в конце вместо true, поэтому, если вы когда-нибудь будете использовать errors.add_to_base в будущем, ваш метод set_status готов прервать сохранение.

Редактировать:
Вы также можете проверить acts_as_state_machine. Это похоже на плагин для того, что вы делаете.

1 голос
/ 23 января 2009

Вы устанавливаете параметры из пользовательского ввода?

Если они не определены как логические столбцы базы данных, вы будете назначать им строку, которая никогда не будет равна true.

...