![](/img/trans.png)
[英]How to create records in has_many through association in rails 3.2
[英]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
錯誤中解救出來,並在我的ApplicationController
以404 Record Not Found
響應,因為當用戶嘗試對不存在的記錄進行GET
, PATCH
, PUT
或DELETE
時,通常會發生此類錯誤,例如, 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之外向我建議的兩個解決方案如下:
解決每個控制器動作中的錯誤
class AuthorsController def create @author = Author.create(params) render json: @author rescue ActiveRecord::RecordNotFound => e render json_error_message end end
在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.