1

我有一个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验证。如果我通过控制台执行以下操作,它虽然可以工作(即它在参数良好时保存,而在参数错误时失败):

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
4

1 回答 1

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/

于 2013-04-22T07:20:16.007 回答