2010-09-27 9 views
10

Soy nuevo en los rieles & tratando de configurar mi primer formulario incrustado. El formulario en sí funciona, pero no puedo determinar cómo enviar mensajes de validación de error a la vista. Supuse que f.object.errors proporcionaría acceso, pero mientras se dice que el método existe, f.object.errors.count siempre devuelve 0 y f.object.errors.any? devuelve falso. Además de no mostrar los mensajes de error reales, el formulario está funcionando como se esperaba, es decir, no se pueden insertar datos no válidos y se regresa al formulario que no aprobó la validación. Modelo, controlador & ver a continuación: cualquier ayuda muy apreciada.Rails 3: ¿Cómo se muestran los mensajes de error en forma incrustada?

... 
<!-- Form embedded in boards/show.html.erb --> 
<%= form_for([@board, @board.boardthreads.build]) do |f| %> 
    <div class="field"> 
     <%= f.label :title %><br /> 
     <%= f.text_field :title %> 
    </div> 
    <div class="field">  
     <div class="actions"> <%= f.submit %> </div> 
    </div> 
<% end %> 
... 



class Boardthread < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :board 

    validates :user, :presence => true 
    validates :board, :presence => true 
    validates :title, :presence => true 
end 


class BoardthreadsController < ApplicationController 
    def create 

     @board = Board.find(params[:board_id]) 
     @boardthread = @board.boardthreads.new(params[:boardthread]) 
     @boardthread.user = current_user 
     @boardthread.save 
     redirect_to board_path(@board) 

    end 
end 

Respuesta

21

Es porque cuando fallaste, vuelves a construir un objeto en tu embedded_form. Necesitas usar el objeto con falla en tu forma.

En su nueva acción necesita construir su objeto y usarlo en su embedded_form. Y durante su creación lo utiliza porque ya está definen

<%= form_for([@board, @boardthread]) do |f| %> 
    <% @boardthread.errors.full_messages.each do |msg| %> 
     <p><%= msg %></p> 
    <% end %> 
    <div class="field"> 
     <%= f.label :title %><br /> 
     <%= f.text_field :title %> 
    </div> 
    <div class="field">  
     <div class="actions"> <%= f.submit %> </div> 
    </div> 
<% end %> 
5

Además de Shingara respuesta: También puede ser necesario añadir el código para mostrar los errores en su forma, como calle detrás

<ul> 
    <%- @boardthread.errors.full_messages.each do |msg| %> 
    <li><%= msg %></li> 
    <%- end %> 
</ul>` 
Cuestiones relacionadas