簡體   English   中英

為什么我的控制器要求將params哈希重復嵌套?

[英]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.

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