我有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
答案 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/
,请参阅此链接