如何在Rails中从不同的控制器创建记录?

时间:2016-02-17 17:58:05

标签: ruby-on-rails ruby model-view-controller

问题:

我有一个Token模型,可以有一个类别(身份验证,刷新,确认,reset_password)。我需要能够从以下控制器操作创建令牌:

  1. 注册#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
    
  2. 确认#post-当用户请求授权访问API时,我需要创建一个身份验证令牌/刷新令牌对。

  3. passwords#post - 当用户请求忘记密码电子邮件时,我需要创建一个reset_password令牌。
  4. 补充说明:

    • 根据类别,有一些自定义逻辑可以完成。
    • 用户和令牌之间的关系是has_many。

    问题:

    有没有办法可以将类别从其中一个控制器传递给令牌控制器的创建操作?

2 个答案:

答案 0 :(得分:1)

您不想创建调用另一个控制器操作的控制器操作。这是可能的,但会给你带来很多问题(因为两者都会尝试渲染)。从一个控制器操作跳转到另一个控制器操作的唯一真正可接受的方法是通过redirect_to,这不会解决您描述的问题。

在MVC框架(例如rails)中,您要做的是将token#create操作的重用部分移动到令牌模型中,然后引用这来自token#createregistrations#postconfirmations#postpasswords#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来为您完成。