嵌套模型验证错误在创建时显示,但不在更新时显示

时间:2013-04-21 16:28:34

标签: ruby-on-rails ruby-on-rails-3 validation

我有Developer模型:has_one User模型。这允许跨不同用户类型进行身份验证和填充。

当我使用不正确的用户数据创建新的开发人员时,它会呈现验证错误列表。当我使用不正确的用户数据更新开发人员时,它只是重新呈现编辑表单(应该如此),但不显示验证错误。

我的验证错误显示代码位于我的字段中,部分用于表单,因此不会产生任何影响。

我觉得问题就在于我正在尝试更新我的模型。

def update
  @developer = Developer.find(params[:id])
  if @developer.user.update_attributes(params[:user]) && @developer.update_attributes(params[:developer])
    flash[:success] = "Profile Updated"
    sign_in @developer.user
    redirect_to @developer
  else
    render 'edit'
  end
end

我的User验证不是什么好看的事:

validates :name,  presence: true, length: {maximum: 30}
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, 
                format: { with: VALID_EMAIL_REGEX },
                uniqueness: { case_sensitive: false }
validates :password, length: {minimum: 6}
validates :password_confirmation, presence: true

我已经阅读了至少10个不同的类似声音的帖子,但我没有发现任何有帮助的内容。任何帮助都会很棒。

修改

当我提交我的update表格时,以下参数通过

Parameters: {"utf8"=>"✓", "authenticity_token"=>"70xmNVxxES7lK2bSIIul/i5GaiJhB9+B5bV/bUVFlTs=", "user"=>{"name"=>"foo", "email"=>"foo@example.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "developer"=>{"skype_name"=>""}, "commit"=>"Save changes", "id"=>"11"}

它仍然没有进行User验证。如果我通过控制台执行以下操作,它可以正常工作(即,当params良好时它会保存,当params坏时它会失败):

Developer.last.update_attributes(:user_attributes => {:name => "test updated", :email => "test@example.com", :password => "123456", :password_confirmation => "123456"})

所以对我来说唯一不同的是:user_attributes,而不仅仅是:user我的表格给了我。我该如何改变?

修改2

我的_fields部分形式的相关部分:

<%= render 'shared/error_messages' %>

<%= fields_for :user do |user| %>
  <%= user.label :name %>
  <%= user.text_field :name %>

  <%= user.label :email %>
  <%= user.text_field :email %>

  <%= user.label :password %>
  <%= user.password_field :password %>

  <%= user.label :password_confirmation, "Confirm Password" %>
  <%= user.password_field :password_confirmation %>
<% end %>

和我的Developer#edit行动:

def edit
  @developer = Developer.find(params[:id])
end

1 个答案:

答案 0 :(得分:1)

无需单独保存用户和开发人员,您可以设法通过这样的开发人员模型保存用户,

    <%= form_for(@developer) do |f| %>

      ... developer's attribute ...

           <%= f.fields_for :user do |ff| %>
            ... user's attribute ...

在控制器中,只有

   @developer = Developer.find(params[:id])
   if @developer.update_attributes(params[:developer])
       ....

在开发人员模型中,您只需要添加

     accepts_nested_attributes_for :user

     attr_accessible :user_attribute

现在form_for也会自动显示用户模型的验证错误。

有关详情http://rubysource.com/complex-rails-forms-with-nested-attributes/

,请参阅此链接