2015-08-03 77 views
1

在我的轨道项目中,我有三个型号:Rails的许多一对多:通过关联嵌套形式

class Subject < ActiveRecord::Base 
    has_many :enrolments 
    has_many :users, through: :enrolments , :foreign_key => :user_id 
    accepts_nested_attributes_for :enrolments 

class User < ActiveRecord::Base 
    has_many :enrolments 
    has_many :subjects, through: :enrolments , :foreign_key => :subject_id 
    accepts_nested_attributes_for :enrolments 

class Enrolment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :subject 
    accepts_nested_attributes_for :user 

subjects_controller.rb

class SubjectsController < ApplicationController 
    def new 
    @subject = Subject.new 
    @user = User.find(params[:id]) 
    @subject.enrolments.build(:user_id => @user.id) 
    end 


    def create 
    @subject= Subject.create(subject_params) 
    respond_to do |format| 
     if @subject.save 
     format.html { redirect_to @subject, notice: 'Subject was successfully created.' } 
     format.json { render :show, status: :created, location: @subject } 
     else 
     format.html { render :new } 
     format.json { render json: @subject.errors, status: :unprocessable_entity } 
     end 
    end 

def subject_params 
    params.require(:subject).permit(:name, 
    enrolments_attributes: [ :user_id, :subject_id, :_destroy, user_attributes: [ :id, :email, :_destroy]] 
    ) 
end 
end 

视图(用于测试,将使用茧插入多个用户):

<div class="container" style="padding-left: 0px;"> 
    <div class="col-md-9"> 
    <p id="notice"><%= notice %></p> 
    <%= form_for @subject, html: {class: "form-horizontal"} do |f| %> 
    <fieldset id="recipe-meta"> 
    <ol> 
     <li class="control-group"> 
     <%= f.label :name, "Subject name", class: "control-label" %> 
     <div class="controls"><%= f.text_field :name %></div> 
     </li> 
    </ol> 
    </fieldset> 

    <fieldset> 
     <%= f.fields_for :enrolments do |enrolment| %> 
     <%= enrolment.hidden_field :subject_id %> 
    <%= enrolment.fields_for :user , User.new do |enrolment_user| %> 
    <%= enrolment_user.label :email %> 
     <%= enrolment_user.text_field :email %> 
    <% end %> 
    <% end %> 
    </fieldset> 

    <%= f.submit %> 
<% end %> 

    </div> 
</div> 

意图:在创建主题的同时手动注册stu用户帐户凹入多个字段(电子邮件),然后插入多个user_id到登记表中。

例报名表:

id user_id subject_id 
-------------------------------------- 
1  2   1 
2  3   1 
3  4   1 

更新(代码现在工作):

添加@subject.enrolment.build到SubjectController def new方法

+0

用户是在里面的注册,不是主题? – alkuzad

回答

0

您将用户添加到您的嵌套形式,但你忘了将它们添加到你的控制器参数whi中telisting。确保用户在SubjectsController的subject_params方法中正确定义。

从下面我的意见:

@JackGoh:你subject_params是错误的,但它不涉及到您的电子邮件领域没有显示。很可能,这将修复不显示@ subject.enrolments.build(用户:@user)的电子邮件。

+0

我在SubjectsController&EnrolmentController,users_attributes:[:id,:email,:_destroy]中添加了subject_params方法。仍然显示相同的错误。这里是我的日志: 参数:{ “UTF8”=> “✓”, “authenticity_token”=> “nrosOiJHQeOOFQ + wL2RS/FlONOUTl3YddN + JtE88vpQcZ + AqcL3O1FmDLUwdj5Znb88oLhP8IpZRJzbc3fYpdQ ==”,“主题 “=> {” 名 “=>” 123 “,”enrolments_attributes“=> {”1438596478232“=> {”users“=> {”id“=>”“,”email“=>”[email protected]“},”_destroy“=>”false“ }}},“commit”=>“创建主题”} –

+0

@JackGoh,你的Enrollment模型有“accep_nested_attributes_for:user”而不是“users”,所以你的fields_for应该有:user而不是“:users”。如果它不起作用,请将您的表单添加到问题中。 – 2015-08-03 10:21:15

+0

@JackGoh,它是user_attributes:[:id,:email,:_destroy]不是users_attributes。 – 2015-08-03 10:31:16

0

控制器中的嵌套与视图和模型中指定的嵌套不同。也许试试这个:

params.require(:subject).permit(
    :name, 
    enrolments_attributes: [ 
    :user_id, :subject_id, :_destroy, 
    user_attributes: [:id, :email, :_destroy] 
    ] 
) 

此外,我会建议重写模型,视图和控制器的“招生”作为“招生”。