Подтвердить что ты не робот

Rails для Zombies Lab 4> Упражнение 3


В третьем упражнении я застрял в четвертой лаборатории Rails для 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>

Я знаю, что совершил ошибку, но не могу понять, где. Пожалуйста, помогите мне.

4b9b3361

Ответ 1

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

Ответ 2

Прежде всего, вы делаете ошибку здесь.

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

он должен быть

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

Вы можете попробовать сделать это

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

Это делает ваш код DRY, согласно wiki

"Не повторяйте себя" (DRY) означает, что информация находится в одном, недвусмысленный место. Например, используя модуль ActiveRecord Rails, разработчику не нужно указывать имена столбцов базы данных в классе определения. Вместо этого Ruby on Rails может извлечь эту информацию из базы данных на основе имени класса.

Ответ 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.

Ответ 4

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

Что сработало для меня.

Ответ 5

это работает для меня

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

Ответ 6

def create @zombie = Zombie.create(params [: zombie]) redirect_to (@zombie) конец

- правильный ответ

Ответ 7

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

- правильный ответ

(извините за двойной пост, в первый раз не заметил код)

Ответ 8

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

Ответ 9

Оригинальный совет # 1

Вам нужно передать параметры [: zombie] в метод Zombie.create.

Оригинальный совет # 2

Затем используйте метод redirect_to с новым зомби, чтобы отправить их на правый zombie_path

Исходный намек № 3

Возможный правильный ответ:

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

Ответ 10

Поскольку функция 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