17


私は 3 番目の演習で 4 番目の Rails for Zombies ラボに行き詰まりました。これが私のタスクです。新しいゾンビを作成し、作成したゾンビのショー ページにリダイレクトするアクションを作成します。次の 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>

間違いを犯したことは知っていますが、どこにあるのかわかりません。私を助けてください。

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

ウィキによると、これによりコードがDRYになります

"Don't repeat yourself" (DRY) は、情報が 1 つの明確な場所にあることを意味します。たとえば、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(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-28T06:00:27.850 に答える
0

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

が正解です

于 2011-03-27T20:12:25.587 に答える
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 に答える
0
def create
     @zombie = Zombie.create(params[:zombie])
     redirect_to (zombies_path)
end
于 2012-02-10T02:01:10.363 に答える