簡體   English   中英

在一個HTTP請求中並從一個控制器(導軌)進行POST和DELETE

[英]POST and DELETE in one http request and from one controller (rails)

我正在構建帶有Rails的api,目前正在嘗試為帖子實現心臟/心臟不適功能。 此功能的工作方式是:如果用戶對帖子進行了設置,則新條目將顯示在數據庫中(一個用戶只能對帖子進行設置一次),如果用戶對它取消設置,則該條目將被刪除。 當前,我在前端檢查用戶是否願意,並發送正確的HTTP請求POST或DELETE。 但是,它不是很有效,我想知道是否有更好的方法可以在后端(控制器或模型)上自動完成它,並且只有一個http請求(例如POST)?

heart.rb Model:

class Heart < ApplicationRecord
  belongs_to :user
  belongs_to :post

  validates :post_id, presence: true
  validates :user_id, presence: true

  validates :user_id, uniqueness: { scope: :post_id }

end 

user.rb Model:

class User < ApplicationRecord
    has_many :posts, dependent: :destroy
    has_many :hearts, dependent: :destroy

    def heart!(post)
        self.hearts.create!(post_id: post.id)
    end

    def unheart!(post)
        heart = self.hearts.find_by_post_id(post.id)
        heart.destroy!
    end
end  

hearts_controller.rb

class HeartsController < ApplicationController

    def heart
        @user = current_user
        @post = Post.find(params[:post_id])
       if @user.heart!(@post)
       end
    end

    def unheart
         @user = current_user
         @heart = @user.hearts.find_by_post_id(params[:post_id])
         @post = Post.find(params[:post_id])
        if @heart.destroy!
        end
    end


end

routes.rb

Rails.application.routes.draw do
 match 'heart', to: 'hearts#heart', via: :post
 match 'unheart', to: 'hearts#unheart', via: :delete

end

如您所見,我需要首先檢查它是否啟動,然后才需要發送正確的POST或DELETE請求。 有沒有一種更有效的方法,可以只發送一個請求,然后在rails內檢查是否發出請求,然后從一個控制器進行發布/刪除?

我建議您只有一種方法可以偵聽帖子的PATCH方法。 就像是:

patch '/posts/:id/heart' => 'posts#heart_post', as: :heart_post

而不是HeartsController ,實現heart_post行動PostsController ,把你的職位和當前用戶和心臟您的文章(不管當前的狀態,無論是善良與否)。

def heart_post
    @post = Post.find(params[:id])
    @post.heart_action(@current_user.id)

    # whatever you want to render
end

然后,您的Post模型將包含其自身的邏輯,並且將知道它是否需要執行有心或無心的動作。

def heart_action (user_id)
    heart = Heart.find_by(user_id: user_id, post_id: self.id)

    if heart
        heart.destroy
    else
        Heart.create(user_id: user_id, link_id: self.id)
    end
end

此操作應該只有一條路線。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM