2

我对 Rails 完全陌生,并且在玩代码以使页面正常工作。链接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 Rails.root 的 Zombie:C:/Sites/TwitterForZombies Application Trace | 框架跟踪 | 完整跟踪 app/controllers/zombies_controller.rb:85:in `get_zombie_params'

localhost:3000/zombies调用action的urlindex不包含id参数。

这就是该应用程序在@zombie=Zombie.find(params[:id]).

如果您想解决此问题,请仅before_filtershow操作时使用。

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您没有 aparams[: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 回答