Ответ 1
def create
@zombie = Zombie.create(params[:zombie])
redirect_to @zombie
end
В третьем упражнении я застрял в четвертой лаборатории 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>
Я знаю, что совершил ошибку, но не могу понять, где. Пожалуйста, помогите мне.
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, согласно wiki
"Не повторяйте себя" (DRY) означает, что информация находится в одном, недвусмысленный место. Например, используя модуль ActiveRecord Rails, разработчику не нужно указывать имена столбцов базы данных в классе определения. Вместо этого 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
Проверьте, что хеш params
от контроллера точно такой же, используя p 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) конец
- правильный ответ
def create
@zombie = Zombie.create(params[:zombie])
redirect_to(@zombie)
end
- правильный ответ
(извините за двойной пост, в первый раз не заметил код)
def create
@zombie = Zombie.create(params[:zombie])
redirect_to (zombies_path)
end
Вам нужно передать параметры [: zombie] в метод Zombie.create.
Затем используйте метод redirect_to с новым зомби, чтобы отправить их на правый zombie_path
Возможный правильный ответ:
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