将业务规则转移到模型中

我之前问了一个问题,引起了一些很好的回应。

这是早先的问题

在那里给出的一些建议的背面,我尝试移动以下控制器逻辑

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? 

例如。

但是,这种逻辑似乎不起作用。 如果我检查对象,状态不会被设置为任何东西。 有谁能发现为什么会发生这种情况? 例如,我是否了解了模型中属性访问的错误?

TIA

而不是status =尝试self.status = 。 我发现我需要使用self. 在模型中更改模型的属性。

errors.empty?也好多了errors.empty? 最后而不是true ,所以如果你以后使用errors.add_to_base ,你的set_status方法就可以中止保存了。

编辑:
您可能还想查看acts_as_state_machine 。 它看起来像一个插件,正是你正在做的事情。

您是从用户输入设置参数吗?

如果它们没有被定义为布尔数据库列,那么您将为它们分配一个字符串,它永远不会等于true。