17


在第三个练习中,我卡在了第四个 Rails for Zombies 实验室。这是我的任务:创建将创建一个新僵尸的操作,然后重定向到创建的僵尸的显示页面。我有以下参数数组:

params = { :zombie => { :name => "Greg", :graveyard => "TBA" } }

我编写了以下代码作为解决方案:

def create
   @zombie = Zombie.create   
   @zombie.name = params[ :zombie [ :name ] ]   
   @zombie.graveyard = params[ :zombie [ :graveyard ] ]
   @zombie.save   

   redirect_to(create_zombie_path)
end

但是当我提交它时,我收到以下错误:
#<TypeError: can't convert Symbol into Integer>

我知道我犯了一个错误,但我不知道在哪里。请帮我。

4

10 回答 10

25
def create
   @zombie = Zombie.create(params[:zombie])
   redirect_to @zombie
end
于 2011-03-07T12:33:17.973 回答
4

首先你在这里做错了

@zombie.name = params[ :zombie [ :name ] ]   

它应该是

   @zombie.name = params[:zombie][:name] 

你可以尝试这样做

def create
   @zombie = Zombie.create(params[:zombie])
   redirect_to(create_zombie_path)
end

根据 wiki,这会使您的代码DRY

“不要重复自己”(DRY)意味着信息位于一个单一的、明确的位置。例如,使用 Rails 的 ActiveRecord 模块,开发人员不需要在类定义中指定数据库列名。相反,Ruby on Rails 可以根据类名从数据库中检索此信息。

于 2011-03-07T12:36:43.627 回答
3

我无法在您的代码中找出任何错误(除了[,]东西,但我认为它是在将代码粘贴到此处时出现的,因为它始终是统一的,当我尝试它时,我得到了另一个错误NoMethodError: undefined method '[]' for :zombie:Symbol),但它可以肯定像这样折射:

def create
   @zombie = Zombie.new(params[:zombie])
   if @zombie.save
     redirect_to @zombie
   else
     render :action => :new
   end
end

使用 .检查params来自控制器的哈希是否完全相同p params

于 2011-03-07T12:44:37.587 回答
1
def create
   @zombie = Zombie.create(params.require(:zombie).permit(:name, :graveyard))
   redirect_to zombie_path(@zombie)
end

这对我有用。

于 2014-03-17T17:45:41.417 回答
1

这对我有用

def create
       @zombie = Zombie.create(zombie_params)
       redirect_to zombie_path(@zombie)
end
于 2014-08-01T18:04:22.680 回答
0

def create @zombie = Zombie.create(params[:zombie]) redirect_to(@zombie) end

是正确的答案

于 2011-03-27T20:12:25.587 回答
0
def create
  @zombie = Zombie.create(params[:zombie])
  redirect_to(@zombie)
end

是正确的答案

(抱歉重复发帖,第一次没注意密码框)

于 2011-03-28T06:00:27.850 回答
0
def create
     @zombie = Zombie.create(params[:zombie])
     redirect_to (zombies_path)
end
于 2012-02-10T02:01:10.363 回答
0

原始提示 #1

您需要将 params[:zombie] 传递给 Zombie.create 方法。

原始提示 #2

然后对新的僵尸使用redirect_to方法将它们发送到正确的zombie_path

原始提示 #3

一个可能的正确答案是:

def create
  @zombie = Zombie.create(params[:zombie])
  redirect_to zombie_path(@zombie)
end
于 2013-10-09T20:44:39.830 回答
0

由于zombie_params 函数已经定义,您可以将其用作create 函数的参数。

class ZombiesController < ApplicationController
  def create
    @zombie= Zombie.create(zombie_params)
    redirect_to @zombie
  end

  private

  def zombie_params
    params.require(:zombie).permit(:name, :graveyard)
  end
end
于 2016-05-22T00:00:07.047 回答