Rails嵌套用户配置文件字段,其中Devise不保留输入

时间:2012-05-27 16:04:10

标签: ruby-on-rails devise nested-attributes

我正在尝试将表单字段添加到我的Devise用户注册视图中。这已经实现,并且在我提交表单时运行验证。但是,如果我收到任何表单错误,输入数据不会按原始表单重新填充表单字段,尽管我可以在我的小调试器中看到正确的值,我已添加到开发视图中。

以下是我的观点:

<h2>Sign up</h2>

<% resource.build_profile %>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
    <%= devise_error_messages! %>

    <div><%= f.label :email %><br />
    <%= f.email_field :email %></div>

    <div><%= f.label :username %> <i>(this cannot be changed so choose wisely)</i><br />
    <%= f.text_field :username %></div>

    <div><%= f.label :password %><br />
    <%= f.password_field :password %></div>

    <div><%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation %></div>

    <%= f.fields_for :profile do |profile_form| %>
        <div><%= profile_form.label :full_name %><br />
        <%= profile_form.text_field :full_name %></div>

        <div><%= profile_form.label :birth_date %><br />
        <%= profile_form.date_select :birth_date, start_year: Time.now.year, end_year: Time.now.year - 80, order: [:day, :month, :year], prompt: { day: 'Choose day', month: 'Choose month', year: 'Choose year' } %></div>

        <div><%= profile_form.label :gender %><br />
        <%= profile_form.select :gender, { "Male" => '0', "Female" => '1' } %></div>

        <div><%= profile_form.label :postcode %><br />
        <%= profile_form.text_field :postcode %></div>

        <div><%= profile_form.label :description, "About you" %><br />
        <%= profile_form.text_area :description %></div>
    <% end %>

    <div><%= f.submit "Sign up" %></div>
<% end %>

<%= render :partial => "devise/shared/links" %>

我没有要显示的控制器代码,因为它使用了Gem中的Devise代码。我做错了什么/不做什么?

3 个答案:

答案 0 :(得分:1)

每次使用build_profile重建配置文件时,这意味着当要重新显示表单时,它使用的是新的配置文件实例,而不是有错误的配置文件。只需更改该代码,以便仅在不存在的情况下构建配置文件:

resource.build_profile unless resource.profile

这样的事情应该有用。

答案 1 :(得分:1)

卡洛斯的回答帮助我解决了这个问题。

resource.build_profile unless resource.profile

答案 2 :(得分:0)

如果您的用户模型引用了配置文件模型,请尝试传递

<%= f.fields_for resource.profile do |profile_form| %>

现在,您正在传递对模型的引用,但表单需要一个实例。