问题:
我有一个Token模型,可以有一个类别(身份验证,刷新,确认,reset_password)。我需要能够从以下控制器操作创建令牌:
注册#posns-当用户注册时,我需要创建一个确认令牌以在欢迎电子邮件中使用。例如:
# POST /users => registrations#create
def create
@user = User.new(create_user_params)
if @user.save
# create confirmation token here. something like Token.create(category: "confirmation")
Api::V1::UserMailer.signup_confirmation(@user.id).deliver_later
render json: @user, status: :created
else
render json: { errors: @user.errors }, status: :unprocessable_entity
end
end
确认#post-当用户请求授权访问API时,我需要创建一个身份验证令牌/刷新令牌对。
补充说明:
问题:
有没有办法可以将类别从其中一个控制器传递给令牌控制器的创建操作?
答案 0 :(得分:1)
您不想创建调用另一个控制器操作的控制器操作。这是可能的,但会给你带来很多问题(因为两者都会尝试渲染)。从一个控制器操作跳转到另一个控制器操作的唯一真正可接受的方法是通过redirect_to
,这不会解决您描述的问题。
在MVC框架(例如rails)中,您要做的是将token#create
操作的重用部分移动到令牌模型中,然后引用这来自token#create
,registrations#post
,confirmations#post
和passwords#post
。这可以是Token.define_token( my_params )
之类的方法,也可以只是现有的Token.create()
方法。
模型行为,例如您所描述的属于模型。控制器应该只是调用它,因为控制器的目的通常是设置视图。
<强>参考文献:强>
答案 1 :(得分:0)
不需要将类别传递给令牌控制器。就像ConnorCMcKee所说的那样,控制器调用另一种控制器方法会让你的生活变得悲惨,而不是如何在MVC框架中完成它。您应该在您的用户控制器中创建令牌,就像您自己编写的示例一样。
def create
@user = User.new(create_user_params)
if @user.save
@user.tokens.create(category: "confirmation")
render json: @user, status: :created
else
render json: { errors: @user.errors }, status: :unprocessable_entity
end
end
如果您想稍后交付,可以使用后台作业gem来为您完成。