Zombies Lab 4的Rails>练习3

时间:2011-03-07 12:23:42

标签: ruby-on-rails ruby rails-for-zombies


我在第三次演习中参加了僵尸实验室的第四次Rails。这是我的任务:创建将创建新Zombie的动作,然后重定向到创建的僵尸的节目页。 我有以下params数组:

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>

我知道我犯了一个错误,但我无法弄清楚在哪里。请帮帮我。

10 个答案:

答案 0 :(得分:25)

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

答案 1 :(得分:4)

首先,你在这里犯了一个错误

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

应该是

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

您可以尝试这样做

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

根据维基

,这会使您的代码 DRY
  

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

答案 2 :(得分: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哈希值是否完全相同。

答案 3 :(得分:1)

def create
   @zombie = Zombie.create(params.require(:zombie).permit(:name, :graveyard))
   redirect_to zombie_path(@zombie)
end

这对我有用。

答案 4 :(得分:1)

这对我有用

def create
       @zombie = Zombie.create(zombie_params)
       redirect_to zombie_path(@zombie)
end

答案 5 :(得分:0)

def创建   @zombie = Zombie.create(params [:zombie])   redirect_to时(@zombie) 端

是正确答案

答案 6 :(得分:0)

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

是正确答案

(对不起双重帖子,第一次没注意到代码框)

答案 7 :(得分:0)

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

答案 8 :(得分: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

答案 9 :(得分: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