簡體   English   中英

Rails-如何處理具有has_many關聯錯誤的記錄創建

[英]Rails - How to handle record create with has_many association error

嘗試在具有has_many關聯的模型上處理#create請求時遇到問題,其中已傳遞的ID之一不屬於現有記錄。

測試要求:

post authors_path, params: { book_ids: [-1] }

控制器方式:

def create
  @author= Author.create params
end

模型:

class Author
  has_many :books
end

這導致引發ActiveRecord::RecordNotFound錯誤。

問題如下:

我已經從ActiveRecord::RecordNotFound錯誤中解救出來,並在我的ApplicationController404 Record Not Found響應,因為當用戶嘗試對不存在的記錄進行GETPATCHPUTDELETE時,通常會發生此類錯誤,例如, get author_path(-1) 我寧願避免將rescue條款移至#show#create等方法上,因為我有很多控制器,從而導致重復代碼很多。

我想保持記錄和關聯創建的原子性,這似乎是最好的方法,但是當發生上述情況時,我還想響應400 Bad Request 處理這種情況的最佳方法是什么?

更新

經過更多研究后,我編寫了一個快速的自定義驗證,用於驗證book_ids所有傳遞的記錄是否存在

class Author < ApplicationRecord  
  validate :books_exist  

  def books_exist  
    return if book_ids.blank?  
    Book.find book_ids
  rescue ActiveRecord::RecordNotFound => e  
    errors.add e.message  
  end  
end

這似乎不起作用,因為即使實例化一個新的Author實例而不將其保存到數據庫中也會引發ActiveRecord::RecordNotFound錯誤:

> Author.new(association_ids: [-1])
  Book Load (2.3ms) SELECT `books`.* FROM `books` WHERE `books`.`id` = -1
ActiveRecord::RecordNotFound: Couldn't find Book with 'id'=[-1]
  from ...

問題似乎是ActiveRecord嘗試在進行任何驗證之前為book_id傳遞的內容查找記錄。 有什么辦法可以挽救這個錯誤? 似乎對於此特定問題沒有太多解決方法。

在StackOverflow之外向我建議的兩個解決方案如下:

  1. 解決每個控制器動作中的錯誤

     class AuthorsController def create @author = Author.create(params) render json: @author rescue ActiveRecord::RecordNotFound => e render json_error_message end end 
  2. ApplicationController創建通用動作

     class ApplicationController def create(model) instance_variable_set("@#(model.class.name}", model.create(params) rescue ActiveRecord::RecordNotFound => e render json_error_message end end class AuthorsController def create super(Author) end end 

暫無
暫無

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

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