我正在使用 Ruby on Rails 7 構建一個 REST API,它通過 HTTP PATCH 接受有效負載,如下所示:
{
"answers": [
{"question_id": 1, "content": "My answer content ONE"},
{"question_id": 2, "content": "My answer content TWO"}
]
}
我想使用強引數在我的控制器中驗證此回應的結構。
我嘗試了一堆類似的 SO 帖子,但似乎沒有一個對我有用。
這是我迄今為止嘗試過的:
params = ActionController::Parameters.new(answers: [{question_id: 1, content: 'some answer'}])
params.require(answers: [:question_id, :content])
# I get: `require': param is missing or the value is empty: {:answers=>[:question_id, :content]} (ActionController::ParameterMissing)
params.require(:answers).require([:question_id, :content])
# I get: NoMethodError on the second .require
params.require(answers: [[:question_id, :content]])
# I get: param is missing or the value is empty: {:answers=>[[:question_id, :content]]}
任何關于我做錯了什么的指示將不勝感激。
uj5u.com熱心網友回復:
在我發布問題后,我找到了解決方案。
有效的解決方案是:
def answer_params
params.require(:answer).each do |answer_param|
answer_param.require(%i[question_id, answer])
end
end
這使我可以確保以正確的結構提供所有值,并在我的控制器方法中使用它,如下所示:
def update
answer_params.each do |answer_param|
puts answer_param['question_id']
puts answer_param['answer']
end
end
uj5u.com熱心網友回復:
為什么堅持只通過驗證引數ActionController::Parameters?我一直發現 params API 對嵌套結構(特別是我構建的 API 更深的結構)有限制,在這種情況下,我總是以最基本的方式驗證資料。例如,對于您展示的資料結構,我將通過以下方式對其進行驗證:
def validate_answers_data
received_answers_arr = params[:answers]
if received_answers_arr.blank?
# return error requires answers not received
return
end
whitelisted_answers_data = []
received_answers_arr.each do |h|
question_id = h[:question_id]
answer_content = h[:content]
if question_id.present? && answer_content.present?
whitelisted_answers_data << { question_id: question_id, content: answer_content }
end
end
if whitelisted_answers_data.blank?
# return error answers data received found invalid
return
end
whitelisted_answers_data
end
Params API 對于將資料列入白名單絕對有用,但是當它對特定資料結構構成限制時,與其堅持只通過該 API 實作驗證,不如通過純 Ruby 構造來實作,這是始終開放的選項。
希望這個建議對您有所幫助。
uj5u.com熱心網友回復:
您可以定義方法以確保引數結構如下所示:
def answer_params
params.permit(answers: %i[question_id content])
end
然后在您的update操作中使用此方法,例如:
def update
answer_params[:answers].each do |answer_param|
puts answer_param['question_id']
puts answer_param['answer']
end
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/517944.html
標籤:轨道上的红宝石红宝石强参数ruby-on-rails-7
上一篇:表格未定義問題?
