Рельсы для Зомби Лаб 4> Упражнение 3 - PullRequest
17 голосов
/ 07 марта 2011


Я застрял в четвертой лаборатории Rails for Zombies в третьем упражнении.Это моя задача: Создать действие, которое создаст нового зомби, а затем перенаправить на страницу показа созданного зомби .У меня есть следующий массив параметров:

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 ]

25 голосов
/ 07 марта 2011
def create
   @zombie = Zombie.create(params[:zombie])
   redirect_to @zombie
end
4 голосов
/ 07 марта 2011

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

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

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

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

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

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

Это делает вашкод СУХОЙ , согласно вики

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

3 голосов
/ 07 марта 2011

Я не могу распознать какую-либо ошибку в вашем коде (за исключением вещей [, ], но я думаю, что это произошло при вставке кода здесь, поскольку он одинаков во всем, и когда я попробовал его, я получилеще одна ошибка 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.

1 голос
/ 01 августа 2014

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

def create
       @zombie = Zombie.create(zombie_params)
       redirect_to zombie_path(@zombie)
end
1 голос
/ 17 марта 2014
def create
   @zombie = Zombie.create(params.require(:zombie).permit(:name, :graveyard))
   redirect_to zombie_path(@zombie)
end

Вот что у меня сработало.

0 голосов
/ 22 мая 2016

Поскольку функция 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
0 голосов
/ 10 октября 2013

Оригинальная подсказка № 1

Вы захотите передать params [: zombie] в метод Zombie.create.

Оригинальная подсказка № 2

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

Оригинальная подсказка № 3

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

def create
  @zombie = Zombie.create(params[:zombie])
  redirect_to zombie_path(@zombie)
end
0 голосов
/ 10 февраля 2012
def create
     @zombie = Zombie.create(params[:zombie])
     redirect_to (zombies_path)
end
0 голосов
/ 28 марта 2011
def create
  @zombie = Zombie.create(params[:zombie])
  redirect_to(@zombie)
end

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

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

0 голосов
/ 28 марта 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...