2

私はレールに完全に慣れておらず、ページを機能させるためのコードで遊んでいます。リンク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

どうしてこれなの?

4

3 に答える 3

4

コメントに基づいて回答を編集する

次のエラーのページが表示されます:ActiveRecord :: RecordNotFound in ZombiesController#index IDがないZombieが見つかりませんでしたRails.root:C:/ Sites/TwitterForZombiesアプリケーショントレース| フレームワークトレース| フルトレースapp/controllers / zombies_controller.rb:85:in `get_zombie_params '

localhost:3000/zombiesアクションを呼び出すURLにはパラメータindexが含まれていません。id

そのため、アプリはで失敗し@zombie=Zombie.find(params[:id])ます。

この問題を修正する場合は、アクションでのみ使用before_filterしてください。show

before_filter :get_zombie_params, only: :show

そして、私が最初に提案したように、これをインデックスアクションに挿入します。

def index
  @zombies = Zombies.all
  ...
end
于 2012-10-23T21:55:17.760 に答える
2

これが発生しているのはresources :zombies、を定義すると、次のルートが取得されるためです。

/zombies
/zombies/:id

したがって、あなたにナビゲートするとき、それは/zombiesありませんparams[:id]nil

Zombie.find指定されたIDのレコードが見つからない場合、メソッドはエラーを発生させ、コードのそれ以上の処理を停止します。

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逆のこともできます。

于 2012-10-24T00:20:45.667 に答える
0

ゾンビのリストを(インデックスビューに)送り返す必要があるため、機能します。get_zombie_params()は正しく実行されますが、@ zombiesをindex()アクションに送信しません。

あなたがする必要があります:

def index 
   @zombies = Zombie.all
   #... the rest of the code
end
于 2012-10-23T21:55:32.363 に答える