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])