ใหม่กับราง การดำเนินการของดัชนีไม่ชอบวิธีการเริ่มต้นของฉัน... เพราะเหตุใด

ฉันยังใหม่กับ Rail และเล่นกับโค้ดเพื่อทำให้เพจทำงานได้ ลิงก์ localhost:3000/zombies/1 ใช้งานได้ (แสดงการทำงาน) แต่ localhost:3000/zombies (การดำเนินการดัชนี) ใช้งานไม่ได้ ด้านล่างนี้คือเส้นทางและตัวควบคุมของฉัน:

เส้นทางคือ: ทรัพยากร :ซอมบี้

ตัวควบคุมคือ:

 class ZombiesController < ApplicationController
    before_filter :get_zombie_params

   def index
    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @zombies }
    end
   end

   def show
    @disp_zombie = increase_age @zombie, 15
    @zombie_new_age = @disp_zombie
    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @zombie }
    end
  end

  def increase_age zombie, incr
   zombie = zombie.age + incr
  end

  def get_zombie_params
    @zombie=Zombie.find(params[:id])
    @zombies = Zombie.all

  end
end

ทำไมเป็นเช่นนี้?


person user836087    schedule 23.10.2012    source แหล่งที่มา
comment
คุณสามารถวางข้อผิดพลาดที่คุณได้รับได้หรือไม่?   -  person ryan0    schedule 24.10.2012
comment
รหัสของคุณดูดีสำหรับฉัน จะเกิดอะไรขึ้นเมื่อคุณเรียกดู /zombies/? มีข้อยกเว้นเกิดขึ้นหรือไม่? คุณได้รับหน้าเปล่าหรือไม่? ข้อมูลเพิ่มเติมจะช่วยให้เราช่วยคุณได้!   -  person alexpls    schedule 24.10.2012
comment
ฉันได้รับหน้าเว็บที่มีข้อผิดพลาด: ActiveRecord::RecordNotFound ใน ZombiesController#index ไม่พบ Zombie หากไม่มี ID Rails.root: C:/Sites/TwitterForZombies Application Trace | การติดตามกรอบงาน | แอปติดตามแบบเต็ม/ตัวควบคุม/zombies_controller.rb:85:ใน `get_zombie_params'   -  person user836087    schedule 24.10.2012
comment
ปัญหาคือคุณกำลังใช้งาน before_filter ทั้งสองเส้นทาง ในรายการคุณสามารถโทร Zombie.find(params[:id]) และ Zombie.all ได้ แต่ในการดำเนินการดัชนี คุณไม่มีพารามิเตอร์ ดังนั้น Zombie.find(params[:id] ของคุณจึงให้ข้อผิดพลาด ActiveRecord   -  person mehulkar    schedule 24.10.2012
comment
ขอบคุณเมฮูล มีวิธีแก้ไขเรื่องนี้ไหม? ฉันต้องการเริ่มต้นทั้งตัวแปรอินสแตนซ์ zombie และ zombies โดยแยกจากกันก่อนวิธีการ   -  person user836087    schedule 24.10.2012


คำตอบ (3)


แก้ไขคำตอบตามความคิดเห็น

ฉันได้รับหน้าเว็บที่มีข้อผิดพลาด: ActiveRecord::RecordNotFound ใน ZombiesController#index ไม่สามารถค้นหา Zombie โดยไม่มี ID Rails.root: C:/Sites/TwitterForZombies Application Trace | การติดตามกรอบงาน | แอปติดตามแบบเต็ม/ตัวควบคุม/zombies_controller.rb:85:ใน `get_zombie_params'

URL localhost:3000/zombies ซึ่งเรียกใช้การดำเนินการ index ไม่รวมพารามิเตอร์ id

นั่นเป็นสาเหตุที่แอปล้มเหลวที่ @zombie=Zombie.find(params[:id])

หากคุณต้องการแก้ไขปัญหานี้ ให้ใช้ before_filter กับการดำเนินการ show เท่านั้น

before_filter :get_zombie_params, only: :show

และแทรกสิ่งนี้ลงในการดำเนินการดัชนีตามที่ฉันแนะนำไปในตอนแรก

def index
  @zombies = Zombies.all
  ...
end
person Jason Kim    schedule 23.10.2012
comment
นี่ไม่ใช่ปัญหา - @zombies ได้รับการมอบหมายใน before_filter แล้ว - person alexpls; 24.10.2012
comment
ใช่. นั่นควรจะได้รับการดูแลโดยตัวกรองก่อนแล้ว - person user836087; 24.10.2012

สิ่งนี้เกิดขึ้นเพราะเมื่อคุณกำหนด resources :zombies คุณจะได้รับเส้นทางเหล่านี้ :

/zombies
/zombies/:id

ดังนั้นเมื่อนำทางไปยัง /zombies คุณไม่มี params[:id] แต่เป็น nil

วิธีการ Zombie.find จะทำให้เกิดข้อผิดพลาดหากไม่พบบันทึกใดๆ ที่มีรหัสที่ระบุ และหยุดการประมวลผลโค้ดของคุณต่อไป

คุณสามารถใช้ Zombie.find_by_id หากคุณไม่ต้องการให้เกิดข้อยกเว้นเมื่อไม่มีผลลัพธ์

แต่ฉันไม่คิดว่านี่คือสิ่งที่คุณต้องการ คุณควรกำหนดวิธี get_zombie_by_id และวิธี get_all_zombies และแยกรหัสออกจาก get_zombie_params ของคุณ

จากนั้นคุณจะต้องกำหนดว่าควรเรียกใช้เมธอดใดก่อนการดำเนินการใดโดยการเปลี่ยน before_filter ในกรณีของคุณ:

 before_filter :get_zombie_by_id, :only => :show
 before_filter :get_all_zombies, :only => :index

วิธีนี้ Zombie.find(params[:id]) จะถูกเรียกเมื่ออยู่ในรายการเท่านั้น คุณยังสามารถใช้ :except เพื่อทำสิ่งที่ตรงกันข้ามได้

person Geoffrey H    schedule 24.10.2012

มันใช้งานได้เพราะคุณต้องส่งรายการซอมบี้ของคุณกลับ ( ไปยังมุมมองดัชนีของคุณ ) get_zombie_params() ดำเนินการอย่างถูกต้องแต่ไม่ได้ส่ง @zombies ไปยังการดำเนินการของ index()

คุณต้องทำ:

def index 
   @zombies = Zombie.all
   #... the rest of the code
end
person hkairi    schedule 23.10.2012