僵尸实验室4的路轨>练习3
在第三次练习中,我参加了僵尸实验室的第四次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
但是当我提交它时,我收到以下错误:
#
我知道我犯了一个错误,但我无法弄清楚在哪里。 请帮我。
def create @zombie = Zombie.create(params[:zombie]) redirect_to @zombie end
首先,你在这里犯了一个错误
@zombie.name = params[ :zombie [ :name ] ]
它应该是
@zombie.name = params[:zombie][:name]
你可以尝试这样做
def create @zombie = Zombie.create(params[:zombie]) redirect_to(create_zombie_path) end
根据维基,这会使您的代码干掉
“不要重复自己”(DRY)意味着信息位于一个明确的地方。 例如,使用Rails的ActiveRecord模块,开发人员不需要在类定义中指定数据库列名。 相反,Ruby on Rails可以根据类名从数据库中检索此信息。
我无法在你的代码中发现任何错误(除了[
, ]
之外的事情,但我认为它是在粘贴代码时出现的,因为它在整个过程中是统一的,当我尝试它时,我得到了另一个错误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
通过使用p params
检查来自控制器的params
散列是否完全相同。
def create @zombie = Zombie.create(params.require(:zombie).permit(:name, :graveyard)) redirect_to zombie_path(@zombie) end
这对我有用。
这对我有用
def create @zombie = Zombie.create(zombie_params) redirect_to zombie_path(@zombie) end
def create @zombie = Zombie.create(params [:zombie])redirect_to(@zombie)end
是正确的答案
def create @zombie = Zombie.create(params[:zombie]) redirect_to(@zombie) end
是正确的答案
(对不起双重post,第一次没注意到代码框)
def create @zombie = Zombie.create(params[:zombie]) redirect_to (zombies_path) end
原始提示#1
你想要将params [:zombie]传递给Zombie.create方法。
原始提示#2
然后使用redirect_to方法和新的僵尸将它们发送到正确的zombie_path
原始提示#3
一个可能的正确答案是:
def create @zombie = Zombie.create(params[:zombie]) redirect_to zombie_path(@zombie) end
由于已经定义了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