[英]Why does my controller require the params hash to be repetitively nested?
我目前有以下情況:
ChallengeRequestsController #new-創建一個ChallengeRequest以及另一個需要recpient_id的模型。
def create
@challenge_request = ChallengeRequest.new(challenge_params)
recipient = User.find(params.require(:recipient_id))
# Rest of method redacted.
end
def challenge_params
params.require(:challenge_request).permit(:action)
end
使用此控制器,我可以進行如下的RSpec測試:
RSpec.describe ChallengeRequestsController, type: :controller do
describe "POST #create" do
context "with valid challenge request" do
let(:valid_challenge_request) { build(:challenge_request) }
context "with non-exisistent recpient id" do
it "throws an error" do
expect{
post :create, :params => {
:challenge_request => {
:challenge_request => valid_challenge_request
},
:recipient_id => 10000
}
}.to raise_error ActiveRecord::RecordNotFound
end
end
end
end
end
僅供參考,這里是工廠:
FactoryGirl.define do
factory :challenge_request do
action { Faker::LeagueOfLegends.champion }
end
end
所有這些代碼都可以正常工作,並且測試通過了,我的問題是如何以不需要在請求中使用丑陋嵌套的方式重構它?
:challenge_request => {
:challenge_request => valid_challenge_request
}
在沒有嵌套的情況下發布請求時:
post :create, :params => {
:challenge_request => valid_challenge_request,
:recipient_id => 10000
}
當ChallengeRequestController收到請求時,challenge_request為空。
如果將valid_challenge_request
更改為屬性的哈希而不是模型本身,則可能會起作用。
let(:valid_challenge_request) { FactoryBot.attributes_for(:challenge_request) }
您正在嘗試將模型實例作為參數發送給控制器,並且某事正在執行某項操作(我無法找到對模型所做的事情),以將其強制轉換為瀏覽器可能發送的內容。控制器。 該轉換將模型轉換為空字符串,該字符串不present
或值為false
,從而導致require
拋出ParameterMissing
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.