2011-09-05 73 views
0

我有两个模型,Character和Initiative,他们的关系是Character has_one Initiative和Initiative belogns_to Character。我正在为Initiative进行验证,并且已经开始工作,但是在输入任何信息之前,为Character创建新的Initiative记录时出现所有验证错误。有任何想法吗?下面是从倡议控制器我的代码:在Rails中提交信息之前出现验证错误?

def new 
    @character = Character.find(params[:character_id]) 
    @initiative = @character.create_initiative(params[:initiative]) 
end 

def edit 
    @character = Character.find(params[:character_id]) 
    @initiative = @character.initiative 
end 

def create 
@character = Character.find(params[:character_id]) 
@initiative = @character.create_initiative(params[:initiative]) 
    if @initiative.save 
    redirect_to character_path(@character), :notice => "initiative successfully created!" 
else 
    render :action => "new" 
    end 
end 

def update 
    @character = Character.find(params[:character_id]) 
    @initiative = @character.initiative 
    if @initiative.update_attributes(params[:initiative]) 
    redirect_to character_path(@character), :notice => 'Initiative information was  successfully updated.' 
else 
    render :action => "edit" 
    end 
end 

,这里是验证自己从我的模型:

validates_presence_of :dex, :misc, :speed 
validates_numericality_of :dex, :misc, :speed 

我敢肯定问题出在创建或新的方法,但我不确定为什么它会在用户输入任何信息之前触发验证。任何帮助?也许不是一个大问题,因为代码正在工作,但我宁愿在实际出现错误之前不显示错误消息。谢谢!

+0

'validate'肯定会被调用。问题在哪里。 'new.html.erb'中有什么?在模型中添加一个'before_validate',看看它是否被调用并从哪里调用。也许'new'中的'create_initiative'导致验证 – Zabba

+0

你是对的,'create_initiative'确实调用验证。请参阅我答案中的链接。 –

回答

1

你不应该在你的新动作中使用build_initiative而不是create_initiative吗?在向用户发送打算创建对象的表单时,无需保存对象。而且,如果你的角色有主动性,他只能拥有一个,所以我怀疑AR赞赏你试图创造另一个。

请参阅http://guides.rubyonrails.org/association_basics.html#has_one-association-reference

+0

感谢您的回答。在新行动中使用create_initiative而不是build_initiative是罪魁祸首。我不太了解两者之间的差异,但您提供的链接有所帮助。 – illbzo1