首页 > 解决方案 > Rails 中的胖模型瘦控制器

问题描述

我正在尝试使用以下逻辑重构控制器。:

    def recover_password
      if params[:login].present?
        if User.exists?(id: params[:login])
          render plain: "Recover by id" status: :ok
        elsif Utils.is_email?(params[:login])
           render plain: "Recover by email" status: :ok
        else
           render plain: "Email not found" status: :unauthorized
        end
      else
        render plain: "Login not found" status: :unauthorized
      end
    end

我试图将业务逻辑发送到User模型,但我不知道这是否是一个好的选择:

def recover_password
  result = User.recover_password(params)
  render plain: result status: :status
end

重构此代码的最佳选择是什么?发送给模型并返回消息?但是如何返回消息和状态码呢?

PS:我无法在控制器中创建另一个方法/动作来分离恢复密码的方式。

标签: ruby-on-railsalgorithmdesign-patterns

解决方案


不确定将这个逻辑添加到 User 模型是否是个好主意。您可以将其移至控制器私有方法。

def recover_password
  result = check_params(params[:login])
  render plain: result[:message], status: result[:status]
end

private 

def check_params(login)
  return { message: "Login not found", status: :unauthorized } if login.blank?
  return { message: "Recover by id", status: :ok } if User.exists?(id: login)
  return { message: "Recover by email", status: :ok} if Utils.is_email?(login)
  { message: "Email not found", status: :unauthorized }
end

推荐阅读