我面臨一個非常奇怪的問題,我在這里找不到答案。我正在嘗試在我的 Rails API 應用程式中使用 Minitest 進行簡單測驗。
我有兩個簡單的模型,一個是電影:
class CreateMovies < ActiveRecord::Migration[7.0]
def change
create_table :movies do |t|
t.string :title
t.text :synopsis
t.datetime :launch_date
t.string :age_classification
t.string :length
t.string :genre
t.string :director
t.string :poster
t.decimal :rating_avg
t.timestamps
end
end
end
另一個是會話
class CreateSessions < ActiveRecord::Migration[7.0]
def change
create_table :sessions do |t|
t.references :movie, null: false, foreign_key: true
t.text :times
t.text :dates
t.timestamps
end
end
end
測驗“should create session”自動生成的測驗函式:
class SessionsControllerTest < ActionDispatch::IntegrationTest
setup do
@movie = movies(:one)
@session = sessions(:one)
end
test "should create session" do
assert_difference("Session.count") do
post sessions_url, params: { session: { dates: @session.dates, movie_id: @session.movie_id, times: '21:00' } }, as: :json
end
assert_response 201
end
end
我遇到以下錯誤:
Minitest::UnexpectedError: ActiveRecord::RecordInvalid: Validation failed: Movie must exist
電影.yml
one:
title: Avatar
synopsis: A paraplegic Marine dispatched to the moon Pandora on a unique mission becomes torn between following his orders and protecting the world he feels is his home
launch_date: 18/12/2009
age_classification: 13
length: 162
genre: Action
director: James Cameron
poster: https://m.media-amazon.com/images/M/MV5BNjA3NGExZDktNDlhZC00NjYyLTgwNmUtZWUzMDYwMTZjZWUyXkEyXkFqcGdeQXVyMTU1MDM3NDk0._V1_SX300.jpg
rating_avg: 8.0
會話.yml
one:
movie: one
times: 16:00
dates: 17/07/2022
我已經確保在執行后行時電影存在,但不知道為什么會這樣。有任何想法嗎?
PD:在 Ruby 3.1.2 和 Ruby On Rails 7.0.4 上運行
我試圖在發布宣告不起作用之前強行創建一部新電影。我還嘗試在創建會話時輸出電影是否存在于控制器中,但它不保存會話,因為ActiveRecord::RecordInvalid: Validation failed: Movie must exist.
uj5u.com熱心網友回復:
您的引數嵌套session在請求中,但您的強引數方法并未反映這種嵌套。
將您的方法更改session_params為:
def session_params
params.require(:session).permit(:movie_id, :times, :dates)
end
當你的引數看起來像這樣
params = { session: { dates: @session.dates, movie_id: @session.movie_id, times: '21:00' } }
并且您只呼叫params.permit(:movie_id, :times, :dates)Rails,然后 Rails 會嘗試在另一個哈希上允許這些鍵/值對。因為這些鍵不存在于外部散列中,而只存在于內部散列中,params.permit(:movie_id, :times, :dates)將回傳一個空{}散列。
但是當您呼叫 時params.require(:session).permit(:movie_id, :times, :dates),require(:session)將要求外部散列上有一個session鍵并回傳其值,即內部散列。然后鏈式permit(:movie_id, :times, :dates)呼叫將允許來自內部哈希的那些鍵/值對,并將回傳:
{ dates: @session.dates, movie_id: @session.movie_id, times: '21:00' }
我建議閱讀官方 Rails 指南中有關強引數的內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/536868.html
標籤:ruby-on-rails红宝石测试迷你测试ruby-on-rails-7
上一篇:RubyonRails:未定義的方法“有嗎?”對于零:NilClass
下一篇:引數缺失或值為空:房間
