2010-07-23 13 views
10

appena provato a scrivere un semplice validates_presence_of nel mio modello, e quando gli errori tentano di rendere, si chiama questo:Mancano modelli dalla nuova app Rails 3?

Template is missing 

Missing template posts/create with {:locale=>[:en, :en], :handlers=>[:builder, :rjs, :erb, :rhtml, :rxml, :haml], :formats=>[:html]} in view paths "/Users/johnsmith/Sites/shwagr/app/views" 

errori non hanno viste separate in Rails3 fanno? Ho pensato che fosse la magia di Rails ..

Curioso se qualcuno ha avuto questo problema, o sapeva come farlo validare correttamente.

il mio modello:

validates_presence_of :category, :name, :url 

mio controller:

def new 
    @post = Post.new 

    respond_to do |format| 
    format.html # new.html.erb 
    format.xml { render :xml => @post } 
    end 
end 


def create 
    @post = Post.new(params[:post]) 
    if @post.valid? && current_user.posts << @post 
    respond_to do |format| 
     if @post.save 
     format.html { redirect_to(@post, :notice => 'Post was successfully created.') } 
     format.xml { render :xml => @post, :status => :created, :location => @post } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 
end 

Aggiornamento

Interessante, ho 'toccare app/views/messaggi/create.html.haml', e ora ha rimosso l'errore e invece carica quella pagina. Ma perché dovrebbe? O ancora più importante, come posso renderlo semplicemente reindirizzare al nuovo percorso (@post) come dovrebbe?

risposta

12

Se la linea

if @post.valid? && current_user.posts << @post 

restituisce false, senza render() o redirect_to() è chiamato. Il comportamento predefinito di Rails consiste quindi nel rendering della vista con lo stesso nome del metodo. Quello sarebbe create.BUILDER.FORMAT.

Provare a rimuovere la linea. Utilizzare questo codice invece:

@post = current_user.posts.new(params[:post]) 
respond_to do |format| 
    if @post.save 
    ... 

O scrivere un caso altro con

render :action => "new" 
1

No, non hanno viste separate. Quindi hai un file app/views/posts/create.html.erb?

+0

No..I hanno un _form/modificare/index/new/spettacolo ..E questo è venuto con la forma era in .. = form_for @post do | f | -if @ post.errors.any? #errorExplanation % h2 = "# {pluralize (@ post.errors.count," error ")} ha impedito il salvataggio di questo post:" % ul - @ post.errors.full_messages.each do | msg | % li = msg Ha bisogno di qualcos'altro? – Trip

+0

Ma qualcosa di strano, mi viene in mente. Perché la validazione "funziona" immediatamente in Rails. Ho aggiornato come appaiono i miei modelli sopra. – Trip

+0

OK. Modifica la tua domanda per mostrarci il codice del controller. –

2

Ah ottenuto. Questo perché non è mai stato valido, quindi ritorna a se stesso su "crea", non trova alcun modello lì e genera un errore. Il modo corretto per impostare il DEF creare sarebbe questo

def create 
    @post = Post.new(params[:post]) 
    if @post.valid? && current_user.posts << @post 
    respond_to do |format| 
     if @post.save 
     format.html { redirect_to(@post, :notice => 'Post was successfully created.') } 
     format.xml { render :xml => @post, :status => :created, :location => @post } 
     else 
     format.html { redirect_to new_user_post_path(:current) } 
     format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 
     end 
    end 
    else 
    render :action => 'new' 
    end 
end