2010-07-23 23 views
10

acaba de intentar escribir un validates_presence_of simple en mi modelo, y cuando los errores intentan hacer, llama a esto:¿Falta plantillas de la nueva aplicación 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" 

errores no tienen vistas separadas en Rails3 ¿verdad? Pensé que eso era magia de Rails.

Curiosidad si alguien tenía este problema, o si sabía cómo validarlo correctamente.

Mi Modelo:

validates_presence_of :category, :name, :url 

Mi controlador:

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 

actualización

interesante, 'toque app/views/posts/create.html.haml', y ahora eliminó el error y en su lugar carga esa página. ¿Pero por qué? O, lo que es más importante, ¿cómo puedo hacer que vuelva a redirigirse al new_post_path (@post) como debería?

Respuesta

12

Si su línea

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

devuelve falso, sin render() o redirect_to() es llamado. El comportamiento predeterminado de Rails es representar la vista con el mismo nombre que su método. Eso sería create.BUILDER.FORMAT.

Intenta eliminar la línea. Utilice este código en su lugar:

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

O escribir un caso más con

render :action => "new" 
1

No, no tienen vistas separadas. Entonces, ¿tienes un archivo app/views/posts/create.html.erb?

+0

No..I tienen un _form/editar/index/nueva/mostrar ..Y este vino con la forma en que era .. = form_for @post hacer | f | -if @ post.errors.any? #errorExplanation % h2 = "# {pluralize (@ post.errors.count," error ")} prohibió que se guarde esta publicación:" % ul - @ post.errors.full_messages.each do | msg | % li = msg Necesita algo más? – Trip

+0

Algo extraño, creo que está pasando aquí. Porque la validación 'funciona' desde el primer momento en Rails. Actualicé cómo se ven mis modelos arriba. – Trip

+0

OK. Por favor edite su pregunta para mostrarnos el código del controlador. –

2

Ah consiguió. Esto se debe a que nunca fue válido, por lo que se volvería automáticamente a sí mismo en 'crear', no encontraría ninguna plantilla allí y saldría un error. La forma correcta de configurar la definición sería crear esta

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 
Cuestiones relacionadas