Rails api - 为什么不正确的 ID 发送 null 而不是 404?
Rails api - why incorrect ID send null instead of 404?
当我在 url 中输入不正确的 track_id 例如:tracks/123456
=> 它 returns 404 not found
正如预期的那样!
如果我尝试使用不正确的 challenge_id
,这是我的另一个模型:tracks/1/challenges/12345
=> 它 return null
而不是 404 not found
.
两者的代码似乎相同,所以我找不到问题所在。
如果你能帮我找到为什么我得到 null
而不是 404
,请参阅下面的代码:
routes.rb
resources :tracks do
resources :challenges do
resources :ressources
end
end
challenges_controller.rb
def show
render json: @challenge, include: [:ressources, :challenges_startups]
end
private
def set_challenge
@track = Track.find(params[:track_id])
@challenge = @track.challenges.where(id: params[:id]).first
end
tracks_controller.rb
def show
render json: @track, include: [:challenges]
end
private
def set_track
@track = Track.find(params[:id])
end
rails_server
对于挑战=>错误的
Started GET "/tracks/3/challenges/20/" for 127.0.0.1 at 2017-07-31 12:24:19 +0200
ActiveRecord::SchemaMigration Load (0.5ms) SELECT "schema_migrations".* FROM "schema_migrations"
Processing by ChallengesController#show as */*
Parameters: {"track_id"=>"3", "id"=>"20"}
Track Load (0.4ms) SELECT "tracks".* FROM "tracks" WHERE "tracks"."id" = ? LIMIT ? [["id", 3], ["LIMIT", 1]]
Challenge Load (0.3ms) SELECT "challenges".* FROM "challenges" WHERE "challenges"."track_id" = ? AND "challenges"."id" = ? ORDER BY "challenges"."id" ASC LIMIT ? [["track_id", 3], ["id", 20], ["LIMIT", 1]]
Startup Load (0.4ms) SELECT "startups".* FROM "startups" ORDER BY "startups"."id" ASC LIMIT ? [["LIMIT", 1]]
[active_model_serializers] Rendered ActiveModel::Serializer::Null with Class (0.18ms)
Completed 200 OK in 63ms (Views: 19.3ms | ActiveRecord: 2.6ms)
曲目
Started GET "/tracks/222" for 127.0.0.1 at 2017-07-31 12:30:37 +0200
Processing by TracksController#show as */*
Parameters: {"id"=>"222"}
Track Load (0.2ms) SELECT "tracks".* FROM "tracks" WHERE "tracks"."id" = ? LIMIT ? [["id", 222], ["LIMIT", 1]]
Startup Load (0.3ms) SELECT "startups".* FROM "startups" ORDER BY "startups"."id" ASC LIMIT ? [["LIMIT", 1]]
[active_model_serializers] Rendered ActiveModel::Serializer::Null with Hash (0.16ms)
Completed 404 Not Found in 6ms (Views: 4.1ms | ActiveRecord: 0.5ms)
您已定义 @challenge
如下所示
@challenge = @track.challenges.where(id: params[:id]).first
where
returns nil
如果没有符合条件的记录。这就是为什么你得到 null 而不是 404 not found.
而 find
相反 returns 404 not found 如果记录不存在。
如果你想得到404 not found,那么修改@challenge
如下
@challenge = @track.challenges.find(params[:id])
当我在 url 中输入不正确的 track_id 例如:tracks/123456
=> 它 returns 404 not found
正如预期的那样!
如果我尝试使用不正确的 challenge_id
,这是我的另一个模型:tracks/1/challenges/12345
=> 它 return null
而不是 404 not found
.
两者的代码似乎相同,所以我找不到问题所在。
如果你能帮我找到为什么我得到 null
而不是 404
,请参阅下面的代码:
routes.rb
resources :tracks do
resources :challenges do
resources :ressources
end
end
challenges_controller.rb
def show
render json: @challenge, include: [:ressources, :challenges_startups]
end
private
def set_challenge
@track = Track.find(params[:track_id])
@challenge = @track.challenges.where(id: params[:id]).first
end
tracks_controller.rb
def show
render json: @track, include: [:challenges]
end
private
def set_track
@track = Track.find(params[:id])
end
rails_server
对于挑战=>错误的
Started GET "/tracks/3/challenges/20/" for 127.0.0.1 at 2017-07-31 12:24:19 +0200
ActiveRecord::SchemaMigration Load (0.5ms) SELECT "schema_migrations".* FROM "schema_migrations"
Processing by ChallengesController#show as */*
Parameters: {"track_id"=>"3", "id"=>"20"}
Track Load (0.4ms) SELECT "tracks".* FROM "tracks" WHERE "tracks"."id" = ? LIMIT ? [["id", 3], ["LIMIT", 1]]
Challenge Load (0.3ms) SELECT "challenges".* FROM "challenges" WHERE "challenges"."track_id" = ? AND "challenges"."id" = ? ORDER BY "challenges"."id" ASC LIMIT ? [["track_id", 3], ["id", 20], ["LIMIT", 1]]
Startup Load (0.4ms) SELECT "startups".* FROM "startups" ORDER BY "startups"."id" ASC LIMIT ? [["LIMIT", 1]]
[active_model_serializers] Rendered ActiveModel::Serializer::Null with Class (0.18ms)
Completed 200 OK in 63ms (Views: 19.3ms | ActiveRecord: 2.6ms)
曲目
Started GET "/tracks/222" for 127.0.0.1 at 2017-07-31 12:30:37 +0200
Processing by TracksController#show as */*
Parameters: {"id"=>"222"}
Track Load (0.2ms) SELECT "tracks".* FROM "tracks" WHERE "tracks"."id" = ? LIMIT ? [["id", 222], ["LIMIT", 1]]
Startup Load (0.3ms) SELECT "startups".* FROM "startups" ORDER BY "startups"."id" ASC LIMIT ? [["LIMIT", 1]]
[active_model_serializers] Rendered ActiveModel::Serializer::Null with Hash (0.16ms)
Completed 404 Not Found in 6ms (Views: 4.1ms | ActiveRecord: 0.5ms)
您已定义 @challenge
如下所示
@challenge = @track.challenges.where(id: params[:id]).first
where
returns nil
如果没有符合条件的记录。这就是为什么你得到 null 而不是 404 not found.
而 find
相反 returns 404 not found 如果记录不存在。
如果你想得到404 not found,那么修改@challenge
如下
@challenge = @track.challenges.find(params[:id])