2011-03-07 9 views
17


W trzecim ćwiczeniu utknąłem w czwartym laboratorium Rails for Zombies. To jest moje zadanie: Stwórz akcję, która utworzy nowego Zombie, a następnie przekieruj do utworzonej strony zombie pokazu. Mam następującą tablicę params:Szyny do Zombie Lab 4> Ćwiczenie 3

params = { :zombie => { :name => "Greg", :graveyard => "TBA" } } 

Napisałem następujący kod jako rozwiązanie:

def create 
    @zombie = Zombie.create 
    @zombie.name = params[ :zombie [ :name ] ] 
    @zombie.graveyard = params[ :zombie [ :graveyard ] ] 
    @zombie.save 

    redirect_to(create_zombie_path) 
end 

Ale kiedy przedstawia go mam następujący błąd:
#<TypeError: can't convert Symbol into Integer>

Wiem, że popełniłem błąd, ale nie wiem, gdzie. Proszę pomóż mi.

+2

'zombie' nie jest przydatną etykietą, ponieważ nie ma sensu samo w sobie. Zmieniłem go na 'rails-for-zombies'. –

+0

@skaffman, jeśli nie podoba ci się tag 'rails-for-zomb', proszę wyjaśnij, co jest z nim nie tak. –

Odpowiedz

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

To działało dobrze, dziękuję! – nosferat

+6

Możesz także po prostu zrobić "redirect_to Zombie.create (params [: zombie])' – jonnii

+0

oszczędza mój czas :) – apis17

4

Przede wszystkim robisz błąd tutaj

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

powinno być

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

Można próbować robić tego

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

To sprawia, że ​​kod DRY, jak na wiki

"Don't repeat yourself"(DRY) means that information is located in a single, unambiguous place. For example, using the ActiveRecord module of Rails, the developer does not need to specify database column names in class definitions. Instead, Ruby on Rails can retrieve this information from the database based on the class name.

+0

Masz literówkę na @ zombie.name = params [: zombie] [: name]] – jhlllnd

+0

@ jhllnd Dzięki. – Rohit

3

nie jestem w stanie dostrzec każdy błąd w kodzie (z wyjątkiem [, ] rzeczy, ale myślę, że przyszedł podczas wklejania kodu tutaj, jak to jest jednolity i kiedy próbowałem, mam kolejny błąd NoMethodError: undefined method '[]' for :zombie:Symbol), ale może być zdecydowanie refractored tak:

def create 
    @zombie = Zombie.new(params[:zombie]) 
    if @zombie.save 
    redirect_to @zombie 
    else 
    render :action => :new 
    end 
end 

Sprawdź, czy params hash z regulatora jest dokładnie taka sama przy użyciu p params.

0

def Utwórz @zombie = Zombie.create (params [: zombie]) redirect_to (@zombie) koniec

jest poprawna odpowiedź

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

jest poprawna odpowiedź

(przepraszam za double post, zrobił zauważyć kod pudełko po raz pierwszy)

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

Original Podpowiedź nr 1

You'll want to pass params[:zombie] to the Zombie.create method.

Original Podpowiedź # 2

Then use the redirect_to method with the new zombie to send them to the right zombie_path

Original Podpowiedź # 3

Możliwym poprawną odpowiedzią jest:

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

To co pracował dla mnie.

+0

Fajnie, dzięki. Dla innych, zauważ, że jest to nowy sposób robienia tego przy użyciu Strong Parameters for Rails 4. Pozostałe odpowiedzi nie są błędne, ale są nieaktualne (i potencjalnie niebezpieczne) –

1

działa to dla mnie

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

Ponieważ funkcja zombie_params jest już zdefiniowana, można po prostu użyć go jako parametr do funkcji tworzenia.

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