【问题标题】:Nested model data not poplating after validation errors验证错误后嵌套模型数据未填充
【发布时间】:2012-01-16 21:38:03
【问题描述】:

我有一个嵌套表单 - 人/用户,1:1 - 用户表单是外部表单。

每次出现验证错误并将用户重定向回页面时,不会加载嵌套的人员属性。

如果没有出现验证错误,一切都会正确保存。

此时,我在搜索中绘制空白并尝试解决此问题。

我已尝试将“has_one/belongs_to”关系放在两个方面,但似乎都没有任何区别。在控制器中,我尝试了尽可能多的数据设置变体 - 有些结果无法保存,但没有一个允许我在错误时返回填充的人员对象。

感谢任何帮助。

Rails 版本:3.1.3

主要形式:

<%= form_for :user, :url => { :action => :create } do |f| -%>
    …    
    <tr>
        <td><%= f.label :login %></td>
        <td><%= f.text_field :login %></td>
    </tr>    
    ...
    <%= render :partial => '/users/form', :locals => { :f => f } %>
    ...        
    <%= submit_tag 'Register' %>    
<% end %>

嵌套表单,加上更多的主表单:

<%= f.fields_for(:person) do |person_form| %>
    <tr>
        <td><%= person_form.label :first %></td>
        <td><%= person_form.text_field :first %></td>
    </tr>
    <tr>
        <td><%= person_form.label :last %></td>
        <td><%= person_form.text_field :last %></td>
    </tr>
    <tr>
        <td><%= person_form.label :email %></td>
        <td><%= person_form.text_field :email %></td>
    </tr>
    <tr>
        <td><%= person_form.label :phone %></td>
        <td><%= person_form.text_field :phone %></td>
    </tr>
<% end %>

<tr>
    <td><%= f.label :challenge_question %></td>
    <td><%= f.text_field :challenge_question %></td>
</tr>

<tr>
    <td><%= f.label :challenge_answer %></td>
    <td><%= f.text_field :challenge_answer %></td>
</tr>

用户:

class User < ActiveRecord::Base
    has_one :person

    devise :database_authenticatable, :confirmable, :recoverable, :registerable, :rememberable, :trackable, :lockable

    attr_accessible :login, :password, :password_confirmation, :remember_me, :challenge_question, :challenge_answer, :person_attributes
    accepts_nested_attributes_for :person

    validates_presence_of :login
    validates_length_of :challenge_question, :maximum => 400
    validates_length_of :challenge_answer, :maximum => 400

    ...
end

人:

class Person < ActiveRecord::Base
    belongs_to :user

    validates_presence_of :email, :first, :last
    validates_uniqueness_of :email
    validates_length_of :email, :within => 3..200
    validates_length_of :first, :maximum => 200
    validates_length_of :last, :maximum => 200
    validates_length_of :phone, :maximum => 20, :allow_nil => true
    validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i, :message => "is not a valid email address."

    # prevents a user from submitting a crafted form that bypasses activation
    # anything else you want your user to change should be added here.
    attr_accessible :email, :first, :last, :phone, :token, :cc_token
end

当页面呈现时,我对@user 和@user.person 进行了检查并得到以下信息:

@用户:

{"challenge_question"=>"", "encrypted_password"=>"", "created_at"=>nil, "failed_attempts"=>0, "updated_at"=>nil, "confirmation_sent_at"=>nil, "last_sign_in_ip"=>nil, "role"=>1, "last_sign_in_at"=>nil, "sign_in_count"=>0, "id"=>nil, "current_sign_in_ip"=>nil, "reset_password_token"=>nil, "person_id"=>nil, "challenge_answer"=>"", "disabled"=>false, "locked_at"=>nil, "confirmation_token"=>nil, "current_sign_in_at"=>nil, "remember_created_at"=>nil, "reset_password_sent_at"=>nil, "login"=>"asdf", "unlock_token"=>nil, "confirmed_at"=>nil, "email"=>""}

@user.person:

{"cc_city"=>nil, "token"=>nil, "last"=>"", "id"=>nil, "cc_token"=>nil, "address_id"=>nil, "phone"=>"", "first"=>"asdf", "email"=>""} 

【问题讨论】:

  • 更新了问题描述以包括显示可变人口的屏幕输出。
  • 我在日志中也看到了这一点,尽管 attr_accessor :person_attributes set: "WARNING: Can't mass-assign protected attributes: person"
  • 另一个更新...我在控制器中找到了一个明确设置人员的位置。将其注释掉会导致用户保存但不会保存人。显然我的关系有问题。只是还没有把它固定下来......
  • 我已经解决了这个问题,但是由于我的声誉低于 100,所以我不让我再发布 4 个小时……届时将发布……

标签: ruby-on-rails nested-forms


【解决方案1】:

不完全确定为什么会这样,但这似乎已经解决了它:

发件人:

<%= f.fields_for(:person) do |person_form| %>

收件人:

<%= f.fields_for(:person, @user.person) do |person_form| %>

文档似乎表明前者应该有效。我还没有深入研究底层代码,以了解为什么这不起作用。

【讨论】:

    猜你喜欢
    • 2012-10-09
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多