如何在rails api response

时间:2016-11-29 08:03:52

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

如果任何条件失败,我正在尝试呈现错误消息。如何传递与失败条件相关的错误消息

但它给了我AbstractController::DoubleRenderError错误

def create
    if @current_wbp_user && params[:user_id] && params[:note_id] && params[:comment] && params[:hashtag]
      user = User.find_by(id: params[:user_id])
      if user.present?
        if user.access_code != @current_wbp_user.access_code
          render json: {errors: "User not associated with this wbp user"}, status: :unprocessable_entity
        end
        note = Note.find_by(id: params[:note_id])
        if note.present?
          if note.user_id != user.id
            render json: {errors: "Invalid note for this user"}, status: :unprocessable_entity
          end
        else
          render json: {errors: "Note not found"}, status: :unprocessable_entity
        end
      else
        render json: {errors: "User not found"}, status: :unprocessable_entity
      end
      @comment = @current_wbp_user.wbp_user_comments.build(wbp_user_comments_params)
      if @comment.save
        render json: {success: true}, status: :ok
      else
        render json: {errors: "Comment could not be created"}, status: :unprocessable_entity
      end
    else
      render json: {errors: "Insufficient Information"}, status: :unprocessable_entity
    end
  end

3 个答案:

答案 0 :(得分:2)

您需要为此块中的每个渲染添加and return

if user.present?
...
end

退出功能。示例:

render json: {errors: "User not associated with this wbp user"}, status: :unprocessable_entity and return

答案 1 :(得分:0)

没有重复的状态代码和一些重构, 您可以通过这种方式在过滤器中进行一些验证,您的方法看起来很瘦,很好

def create
    sucess = false
    if @current_wbp_user && [:user_id, :note_id, :comment, :hashtag].all? {|s| params.key? s}
      user = User.find_by(id: params[:user_id])
      if user.present?
        if user.access_code != @current_wbp_user.access_code
          message = "User not associated with this wbp user"
        end
        note = Note.find_by(id: params[:note_id])
        if note.present?
          if note.user_id != user.id
            message = "Invalid note for this user"
          end
        else
          message = "Note not found"
        end
      else
        message = "User not found"
      end
      @comment = @current_wbp_user.wbp_user_comments.build(wbp_user_comments_params)
      if @comment.save
        sucess = true
      else
        message = "Comment could not be created"
      end
    else
      message = "Insufficient Information"
    end

    if sucess
      render json: {success: true}, status: :ok
    else
      render json: {errors: message}, status: :unprocessable_entity
    end
  end

答案 2 :(得分:0)

def create
  error_msgs = Array.new
  if @current_wbp_user && params[:user_id].present? && params[:note_id].present?
    user = User.find_by(id: params[:user_id])
    if user.present?
      if user.access_code != @current_wbp_user.access_code
        error_msgs << "User not associated with this wbp user"
      end
      note = Note.find_by(id: params[:note_id])
      if note.present?
        if note.user_id != user.id
          error_msgs << "Invalid note for this user"
        end
      else
        error_msgs << "Note not found"
      end
    else
      error_msgs << "User not found"
    end

    if params[:comment].present? && params[:hashtag].present?
      @comment = @current_wbp_user.wbp_user_comments.build(wbp_user_comments_params)
      if @comment.save
        render json: {success: true}, status: :ok
        return
      else
        error_msgs << "Comment could not be created"
      end
    end
  else
    error_msgs << "Insufficient Information"
  end

  if error_msgs.present?
    render json: {errors: error_msgs}, status: :unprocessable_entity
  end
end