【问题标题】:Ruby on Rails API how to soft delete an userRuby on Rails API 如何软删除用户
【发布时间】:2015-11-10 19:45:06
【问题描述】:

我可以从主应用程序中软删除用户。 以下是详细信息。

用户网址是:

http://0.0.0.0:3000/users/4c7fa12c-3d58-480b-a823-6c67d6e7f0fe.json

呈现如下 JSON 结果:

{"id":"4c7fa12c-3d58-480b-a823-6c67d6e7f0fe","name":"John","status":"Active","created_at":"2015-11-10T18:31:27.000 +00:00","updated_at":"2015-11-10T18:38:20.000+00:00"}

我可以通过这种方式使用停用来进行软删除:

http://0.0.0.0:3000/users/4c7fa12c-3d58-480b-a823-6c67d6e7f0fe/inactivate

这是我在用户控制器中的停用方法:

  def inactivate
    @user.update status: 'Inactive'
    redirect_to users_url
  end

重新加载用户URL时显示结果:

{"id":"4c7fa12c-3d58-480b-a823-6c67d6e7f0fe","name":"John","status":"Inactive","created_at":"2015-11-10T18:31:27.000 +00:00","updated_at":"2015-11-10T19:29:58.000+00:00"}

现在我的用户处于“非活动状态”。

这是我的路线文件:

Rails.application.routes.draw do
  resources :wit_dims
  resources :wokas
  resources :posts
  resources :languages
  resources :users
  root :to => "home#index"

  resources :users do
    get 'inactivate', on: :member
  end

  match 'inactivate', to: 'users#inactivate', via: 'delete'

  #api
  namespace :api do
    namespace :v1 do
      resources :users, only: [:index, :create, :show, :update, :destroy]
      resources :posts, only: [:index, :create, :show, :update, :destroy]
    end
  end

end

如何更改此路由文件和 API 用户控制器以通过 API 实现相同的停用王?我想要的不仅仅是一个简单的解决方案,它使用 PUT 将用户的状态从 Active 更改为 Inactive。

这是我的主要应用程序用户控制器:

class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy, :inactivate]

  # GET /users
  # GET /users.json
  def index
    @users = User.all
  end

  # GET /users/1
  # GET /users/1.json
  def show
  end

  # GET /users/new
  def new
    @user = User.new
  end

  # GET /users/1/edit
  def edit
  end

  # POST /users
  # POST /users.json
  def create
    @user = User.new(user_params)
    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /users/1
  # PATCH/PUT /users/1.json
  def update
    respond_to do |format|
      if @user.update(user_params)
        format.html { redirect_to @user, notice: 'User was successfully updated.' }
        format.json { render :show, status: :ok, location: @user }
      else
        format.html { render :edit }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /users/1
  # DELETE /users/1.json
  def destroy
    @user.destroy
    respond_to do |format|
      format.html { redirect_to users_url, notice: 'User was successfully inactivated.' }
      format.json { head :no_content }
    end
  end

  def inactivate
    @user.update status: 'Inactive'
    redirect_to users_url
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def user_params
      params[:user]
    end
end

这是我的 API 用户控制器:

class Api::V1::UsersController < Api::V1::BaseController
  before_action :set_user, only: [:show, :update, :destroy]

  def show
    render(json: Api::V1::UserSerializer.new(@user).to_json)
  end

  def update
    if @user.update_attributes(user_params)
      render(
        json: Api::V1::UserSerializer.new(@user).to_json,
        status: 200,
        location: api_v1_user_path(@user.id)
      )
    else
      return api_error(status: 422, errors: @tbm.errors)
    end
  end

  def index
    users = User.all
    render(
      json: ActiveModel::ArraySerializer.new(
        users,
        each_serializer: Api::V1::UserSerializer,
        root: 'users'
      )
    )
  end

  def create
    @user = User.new(user_params)
    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @user.destroy
    respond_to do |format|
      format.html { redirect_to users_url, notice: 'User was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    def set_user
      @user = User.find(params[:id])
    end

    def user_params
      params.require(:user).permit(:name, :status).delete_if{ |k,v| v.nil? }
    end
end

基本上我希望能够通过 API 调用一个 inactivate 方法,它将状态从 Active 更改为 Inactive,而不是物理删除/销毁用户。

【问题讨论】:

  • 嗯?为什么不对inactivate 操作做同样的事情呢?
  • GET 不应更改数据库 - get 'inactivate', on: :member。为什么要这样做?
  • 我不知道如何通过 API 对停用操作执行相同的操作。我很好,这是如何从主用户控制器工作的。需要提示如何通过 API 执行相同操作。

标签: ruby-on-rails api


【解决方案1】:

我使用 PUT 并在状态属性上执行更新以将用户标记为非活动。

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多