Ruby on Rails – 不保存用户 – 嵌套属性和嵌套表单

我有这个型号User,Entidade和Candidato。

class User < ActiveRecord::Base has_one :entidade has_one :candidato accepts_nested_attributes_for :entidade accepts_nested_attributes_for :candidato class Candidato < ActiveRecord::Base belongs_to :user class Entidade < ActiveRecord::Base belongs_to :user 

基本上,为了注册,您需要指定是否要成为Entidade或Candidato。 它们有一些共享属性,我放在User表中。 并且非共享属性保留在相应的表中。

这是forms:

  { :multipart => true } do |f| %>    :hidden, :input_html => { :value => "candidato" } %>     "Foto" %>  "Código-Postal" %>   "Contactos" %>   "Página Pessoal" %>   "Data de Nascimento" %>  "Bilhete de Identidade" %>  "Curriculum Vitae" %>  "Área Profissional" %>  "Área Profissional" %>  "Apresentação" %>  "Nível de Habilitações" %>  "Habilitações Literárias" %>  "Situação Profissional" %>  "Experiência Profissional" %>    

我无法创造该死的用户。 它不断渲染新页面。 到底出了什么问题。

这是我的控制器:

 class UsersController  [:data_nascimento,:bi,:cv,:area_profissional,:apresentacao,:nivel_hab,:hab_literaria,:situacao_prof,:exp_profissional], :entidade_attributes => [:nip,:apresentacao,:atividade]) end end 

如果有人知道什么是错的,请告诉我

问题在于你的create方法,你正在构建依赖对象两次,并且你有has_one关系。 您对已在父项上的新操作上创建的依赖模型进行了对象。

您的控制器应如下所示:

 def create @user = User.new(user_params) if @user.save redirect_to root_path else @role = user_params[:role] render 'new' end end 

表格应如下所示:

 <%= simple_form_for @user, :html => { :multipart => true } do |f| %> <%= render 'shared/error_messages' %> <%= f.input :email %> <%= f.input :role, :as => :hidden, :input_html => { :value => @role } %> <%= f.input :password %> <%= f.input :password_confirmation, label: "Confirme a password" %> <%= f.input :nome %> <%= f.input :foto, :label => "Foto" %> <%= f.input :cod_postal, :label => "Código-Postal" %> <%= f.input :localidade %> <%= f.input :contacto1, :label => "Contactos" %> <%= f.input :contacto2, label: false %> <%= f.input :pagina, :label => "Página Pessoal" %> <% if @role == "candidato" %> <%= f.fields_for :candidato do |ff| %> <%= ff.input :data_nascimento, :label => "Data de Nascimento" %> <%= ff.input :bi, :label => "Bilhete de Identidade" %> <%= ff.input :cv, :label => "Curriculum Vitae" %> <%= ff.label :area_profissional, :label => "Área Profissional" %> <%= ff.select :area_profissional, ["Programador_Web", "Programador_Java","Gestor"], :label => "Área Profissional" %> <%= ff.input :apresentacao, :label => "Apresentação" %> <%= ff.select :nivel_hab, ["Secundário","Licenciatura","Mestrado","Doutoramento"], :label => "Nível de Habilitações" %> <%= ff.input :hab_literaria, :label => "Habilitações Literárias" %> <%= ff.select :situacao_prof, ["Empregado","Desempregado"], :label => "Situação Profissional" %> <%= ff.input :exp_profissional, :label => "Experiência Profissional" %> <% end %> <%else%> <%= f.fields_for :entidade do |ff| %> <%= ff.input :atividade, :label => "atividade" %> <%= ff.input :apresentacao, :label => "apresentacao" %> <%= ff.input :nip, :label => "nip" %> <% end %> <% end %> <%= f.submit "Registar", class: "btn btn-large btn-primary" %> <% end %> 

您还必须在属性中添加:id和_destroy。 它将在编辑和删除子模型时使用。

 def user_params params.require(:user).permit(:role,:email,:nome,:password,:password_confirmation,:pagina,:contacto1,:contacto2,:foto,:cod_postal,:localidade, :candidato_attributes => [:id, :data_nascimento,:bi,:cv,:area_profissional,:apresentacao,:nivel_hab,:hab_literaria,:situacao_prof,:exp_profissional, :_destroy], :entidade_attributes => [:id, :nip,:apresentacao,:atividade, :_destroy]) end 
 #app/controllers/users_controller.rb Class UsersController < ApplicationController def new @user = User.new @user.send("build_#{params[:param]}") end def create @user = User.new user_params @user.save end private def user_params params.require(:user).permit(:role,:email,:nome,:password,:password_confirmation,:pagina,:contacto1,:contacto2,:foto,:cod_postal,:localidade, :candidato_attributes => [:data_nascimento,:bi,:cv,:area_profissional,:apresentacao,:nivel_hab,:hab_literaria,:situacao_prof,:exp_profissional], :entidade_attributes => [:nip,:apresentacao,:atividade]) end end 

传递嵌套属性时,只需构建初始关联对象

您的 create方法中,您将再次构建关联数据。 更好的方法是使用上面的代码(虽然编辑代表你的重定向),创建User对象

除了Validations ,我没有看到任何理由为什么上述代码不适用于您的表单