2013-10-06 73 views
0

我已经使用Devise gem设置了一个应用程序来登录(用户模型)。在注册视图中,iive包括一个simple_fields_for表单,其中包含Student模型的属性。Devise中的嵌套窗体(Rails 3.2) - 不保存

所有内容在视图中都正确显示,但是当单击提交按钮时,不会创建嵌套记录。

用户模型

class User < ActiveRecord::Base 
# Include default devise modules. Others available are: 
# :confirmable, :lockable, :timeoutable and :omniauthable 
devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 

# Setup accessible (or protected) attributes for your model 
attr_accessible :email, :password, :password_confirmation, :remember_me, :role, :student_attributes 
# attr_accessible :title, :body 

has_one :student, :inverse_of => :user, :autosave => true 
accepts_nested_attributes_for :student 

end 

学生模型

Class Student < ActiveRecord::Base 
    attr_accessible :course, :email, :fname, :lname, :student_num, :university, :year 

    set_primary_key :student_num 

    belongs_to :user, :inverse_of => :student, :autosave => true 

    has_many :attendances 
    has_many :teaching_sessions, through: :attendances 

    has_many :completed_outcomes 

    validates :student_num, presence: true 
    validates :fname, presence: true 
    validates :lname, presence: true 
    validates :university, presence: true 
    validates :course, presence: true 
    validates :year, presence: true 
    validates :email, presence: true 


    def self.import(file) 
CSV.foreach(file.path, headers: true) do |row| 
    Student.create! row.to_hash 
end 
    end 

    def full_name 
    "#{fname} #{lname}" 
    end 

end 

设计登记表

<h2>Sign up</h2> 

<%= simple_form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> 
<%= f.error_notification %> 

<h3>Login Details</h3> 

<div class="form-inputs"> 

    <%= f.input :email, :required => true, :autofocus => true %> 
    <%= f.input :password, :required => true %> 
    <%= f.input :password_confirmation, :required => true %> 
    <%= f.select :role, ["Student","Teacher","Admin"], :required => true %> 
</div> 

<h3>Profile</h3> 

<div id = "student_fields"> 
    <%= simple_fields_for :student do |s| %> 
    <%= s.input :student_num %> 
    <%= s.input :fname %> 
    <%= s.input :lname %> 
    <%= s.input :university %> 
    <%= s.input :course %> 
    <%= s.input :year %> 
    <% end %> 
</div> 

<br /> 

<div class="form-actions"> 
    <%= f.button :submit, "Sign up" %> 
</div> 

<% end %> 

<br /> 

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

定制设计控制器

class Users::RegistrationsController < Devise::RegistrationsController 

    def new 
    resource = build_resource({}) 
    resource.build_student 
    respond_with resource 
    end 

    def create 
super 
    end 

    def update 
super 
    end 

end 

我几乎读过这里的每篇文章,并且仍然无法找到一种方法来在单击“提交”按钮时获取嵌套模型以进行保存。创建用户记录没有问题,但学生的详细信息不会保存。如果有人有任何建议,我将非常感激。我确信它很简单,我很想念,但我一整天都在摔跤!

最良好的祝愿,

迈克

回答

0

您是否尝试过用一个 “f”。在你的simple_fields_for的前面?

<%= f.simple_fields_for :student do |s| %> 

参见:https://github.com/plataformatec/simple_form#simple-fields-for

+0

那frickin真棒的感谢! 我最初尝试过使用f.simple_fields_for,但是这是在一个部分内,并返回一个错误,说“f”没有找到或一些这样的。 非常感谢你!我知道这会很简单。 干杯! Mike –

+0

如果您想将“f”传递给包含'simple_fields_for'输入字段的部分,您可以从<%= render partial:'yourpartialhere',locals:{f:f}%>'从主视图。 – cschroed