首页 > 解决方案 > 修复 ruby​​ 中的重复方法

问题描述

我正在用 ruby​​ on rails 编写一个 API,我发现我的方法非常重复。这就是我几乎所有方法的样子。它们都遵循类似的结构;我只是抓住了我的一种方法并将其放在这里:

def create
  if current_user

    @object = Object.new(object_params)

    if @object.save
      render json: {
        status:  "SUCCESS",
        message: "object saved"
      }, status: :ok
    else
      render json: {
        status: "ERROR",
        message: "Could not save object"
      }, status: :unprocessable_entity
    end
  else
    render json: {
      status: "UNAUTHORIZED"
    }, status: :unauthorized
  end
end

当然,并不是我所有的方法都创建和保存对象。但它们都遵循类似的模式。首先我检查是否current_user不是零。如果是,我会呈现一个 JSON 响应:

if current_user
  # do something
else
  render json: {
    status: "UNAUTHORIZED"
  }

如果找到当前用户,并且无论该方法必须运行是否成功,那么我将呈现另一个 JSON 响应:

if everything_went_well
  render json: {
    status: "SUCCESS",
    message: "Everything went ok!"
  }
else
  render json: {
    status: "ERROR",
    message: "There was a problem!"
  }
end

我很确定有一种方法可以抽象出这种功能。我在网上查找了一些有用的提示,但在项目的其他部分(即模型和视图)中有所帮助。然而,我在网上看到的大多数技巧都不太适合我的控制器中的代码。

标签: ruby-on-railsrubyrefactoringstyling

解决方案


您可以before_filter为此使用 a 。请注意,当before_action已经渲染了一个视图时,该操作本身将不再被调用。

before_action :check_permission

def create
  @object = Object.new(object_params)

  if @object.save
    render json: {
      status:  "SUCCESS",
      message: "object saved"
    }, status: :ok
  else
    render json: {
      status: "ERROR",
      message: "Could not save object"
    }, status: :unprocessable_entity
  end
end

private 

def check_permission
  return if current_user

  render json: {
    status: "UNAUTHORIZED"
  }, status: :unauthorized
end

推荐阅读