在我的轨道项目中,我有三个型号: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
到SubjectControllerdef new
方法
用户是在里面的注册,不是主题? – alkuzad