不同的模型回调取决于API还是应用内

时间:2018-09-26 00:53:52

标签: ruby-on-rails api model callback

我想将一个移动应用程序添加到我的Web应用程序中,该移动应用程序的用户模型有所不同。具体来说,当用户在Web应用程序中注册时,该模型会生成一个激活摘要,并通过电子邮件发送给他们以供单击。回调是:

# app/models/user.rb
before_create :create_activation_digest

我将对具有api名称空间的api使用其他Users_controller。当新用户从移动应用程序注册时,我不想创建激活摘要,而是生成访问令牌。

# app/models/user.rb
before_create :generate_access_token

那么,最好的方法是运行第一个(如果是应用程序内注册),第二个(如果是移动应用程序注册)。我应该从控制器而不是模型回调中调用方法吗?还是模型中有更好的方法?

2 个答案:

答案 0 :(得分:2)

根据我的经验,不惜一切代价避免模型回调。它们很难跳过,有点难以测试,很难根据上下文进行自定义。

我会考虑创建用户工厂类并在您的控制器中调用它们,您可以轻松地传递上下文并进行任何其他需要的自定义。

编辑,因为我还没有真正给你一种方法。

如果您真的想通过回调来实现,那么可能的唯一方法就是在用户模型中定义一个新属性(不由数据库字段支持),例如

attr_accessor :created_from_api

在控制器中设置该属性,然后自定义模型回调,例如

before_create :create_activation_digest, unless: :created_from_api

这应该可以,但是如果我在你的位置,我真的会放弃回调。

答案 1 :(得分:0)

在我看来,创建和激活摘要以及生成访问令牌不属于User模型-似乎对User负有太多责任。

就个人而言,对于控制器,我会说同样的话。

所以,我建议您使用服务对象。