2011-09-24 8 views
6

Cuando publico un formulario para crear una nueva consulta con un comentario secundario (en la aplicación, las consultas pueden tener varios comentarios), el comentario no se está creando. Funciona cuando se eliminan las validaciones de presencia. Entonces tiene que ver con el orden en que las cosas se construyen y se guardan. ¿Cómo preservar las validaciones y mantener el código limpio?Identificación de asociación no establecida con accept_nested_attributes_for y decent_exposure

(El siguiente es un ejemplo de modo que no puede ser exactamente runable)

modelos/inquiry.rb

class Inquiry < ActiveRecord::Base 
    has_many :comments 
    accepts_nested_attributes_for :comments 

modelos/comment.rb

class Comment < ActiveRecord::Base 
    belongs_to :inquiry 
    belongs_to :user 
    validates_presence_of :user_id, :inquiry_id 

controladores/inquiry_controller. rb

expose(:inquiries) 
expose(:inquiry) 

def new 
    inquiry.comments.build :user => current_user 
end 

def create 
    # inquiry.save => false 
    # inquiry.valid? => false 
    # inquiry.errors => {:"comments.inquiry_id"=>["can't be blank"]} 
end 

vistas/investigaciones/new.html.haml

= simple_form_for inquiry do |f| 
    = f.simple_fields_for :comments do |c| 
    = c.hidden_field :user_id 
    = c.input :body, :label => 'Comment' 
= f.button :submit 

esquema de base de

create_table "inquiries", :force => true do |t| 
    t.string "state" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 
create_table "comments", :force => true do |t| 
    t.integer "inquiry_id" 
    t.integer "user_id" 
    t.text  "body" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 
+0

Por favor, muestre las migraciones que crean estas tablas, o si no se construye mediante migraciones, por favor, muestre la base de datos descrita. –

+0

bien, agregué un extracto de schema.rb – linojon

Respuesta

1

Básicamente, antes de guardar también está probando la presencia de inquiry_id, la asociación regreso de comentario a la investigación, que no puede ser establecer hasta que se guarde el comentario. Una forma alternativa para lograr esto y todavía tienen sus validaciones intacta sería la siguiente:

comment = Comment.new({:user => current_user, :body => params[:body] 
comment.inquiry = inquiry 
comment.save! 
inquiry.comments << comment 
inquiry.save! 

O una forma alternativa sería

= simple_form_for inquiry do |f| 
    = f.simple_fields_for :comments do |c| 
    = c.hidden_field :user_id 
    = c.hidden_field :inquiry_id, inquiry.id 
    = c.input :body, :label => 'Comment' 
= f.button :submit 

Básicamente añadiendo la siguiente línea en su formulario de comentarios

= c.hidden_field :inquiry_id, inquiry.id 
Cuestiones relacionadas