Baru mengenal rel. Tindakan indeks tidak menyukai metode inisialisasi saya.. Mengapa?

Saya benar-benar baru mengenal Rails dan bermain-main dengan kode untuk membuat halaman berfungsi. Tautan localhost:3000/zombies/1 berfungsi (tampilkan tindakan) tetapi localhost:3000/zombies (tindakan indeks) tidak. Di bawah ini adalah rute dan pengontrol saya:

RUTE ADALAH: sumber daya :zombie

KONTROLER adalah:

 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

Kenapa ini?


person user836087    schedule 23.10.2012    source sumber
comment
dapatkah Anda menempelkan kesalahan yang Anda terima?   -  person ryan0    schedule 24.10.2012
comment
Kode Anda terlihat baik-baik saja bagi saya. Apa yang sebenarnya terjadi saat Anda menjelajah ke /zombies/? Apakah pengecualian dilempar? Apakah Anda mendapatkan halaman kosong? Info lebih lanjut akan membantu kami membantu Anda!   -  person alexpls    schedule 24.10.2012
comment
Saya mendapatkan halaman dengan kesalahan: ActiveRecord::RecordNotFound di ZombiesController#index Tidak dapat menemukan Zombie tanpa ID Rails.root: C:/Sites/TwitterForZombies Application Trace | Jejak Kerangka | Aplikasi Jejak Penuh/controllers/zombies_controller.rb:85:di `get_zombie_params'   -  person user836087    schedule 24.10.2012
comment
Masalahnya adalah Anda menjalankan before_filter di kedua rute. Di acara Anda dapat menelepon Zombie.find(params[:id]) dan Zombie.all. Namun dalam tindakan indeks, Anda tidak memiliki parameter apa pun, jadi Zombie.find(params[:id] Anda memberi Anda kesalahan ActiveRecord.   -  person mehulkar    schedule 24.10.2012
comment
Terima kasih Mehul, Apakah ada jalan keluarnya? Saya ingin menginisialisasi variabel instan zombie dan zombie dalam metode sebelumnya yang terpisah.   -  person user836087    schedule 24.10.2012


Jawaban (3)


Mengedit jawaban berdasarkan komentar

Saya mendapatkan halaman dengan kesalahan: ActiveRecord::RecordNotFound di ZombiesController#index Tidak dapat menemukan Zombie tanpa ID Rails.root: C:/Sites/TwitterForZombies Application Trace | Jejak Kerangka | Aplikasi Jejak Penuh/controllers/zombies_controller.rb:85:di `get_zombie_params'

Url, localhost:3000/zombies yang memanggil tindakan index tidak menyertakan parameter id.

Itu sebabnya aplikasi gagal di @zombie=Zombie.find(params[:id]).

Jika Anda ingin memperbaiki masalah ini, gunakan before_filter pada tindakan show saja.

before_filter :get_zombie_params, only: :show

Dan masukkan ini ke dalam tindakan indeks seperti yang saya sarankan sebelumnya.

def index
  @zombies = Zombies.all
  ...
end
person Jason Kim    schedule 23.10.2012
comment
Ini bukan masalah - @zombies telah ditetapkan di before_filter - person alexpls; 24.10.2012
comment
Ya. Itu seharusnya sudah ditangani oleh filter sebelumnya - person user836087; 24.10.2012

Hal ini terjadi karena ketika Anda mendefinisikan resources :zombies, Anda mendapatkan rute berikut :

/zombies
/zombies/:id

Oleh karena itu ketika bernavigasi ke /zombies Anda tidak memiliki params[:id], itu adalah nil

Metode Zombie.find akan memunculkan kesalahan jika tidak dapat menemukan catatan apa pun dengan id yang diberikan dan menghentikan pemrosesan kode Anda lebih lanjut.

Anda dapat menggunakan Zombie.find_by_id jika Anda tidak ingin pengecualian dimunculkan ketika tidak ada hasil.

Tapi menurut saya ini bukan yang Anda inginkan di sini, Anda lebih suka mendefinisikan metode get_zombie_by_id dan metode get_all_zombies dan memisahkan kode dari get_zombie_params Anda

Maka Anda harus menentukan metode mana yang harus dipanggil sebelum tindakan apa dengan mengubah before_filter Anda seperti ini, dalam kasus Anda:

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

Dengan cara ini Zombie.find(params[:id]) hanya akan dipanggil saat sedang melakukan aksi pertunjukan. Anda juga dapat menggunakan :except untuk melakukan hal sebaliknya.

person Geoffrey H    schedule 24.10.2012

itu berhasil karena Anda perlu mengirim kembali (ke tampilan indeks Anda) daftar zombie Anda. get_zombie_params() dijalankan dengan benar tetapi tidak mengirim @zombies ke tindakan index().

Anda perlu melakukan:

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