【问题标题】:Rails many-to-many :through association nested formRails 多对多:通过关联嵌套形式
【发布时间】:2015-08-03 09:45:36
【问题描述】:

在我的 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

查看(为了测试,会使用cocoon插入多个用户):

<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>

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

示例注册表:

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

更新(代码现在可以使用):

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

【问题讨论】:

  • 用户在注册范围内,不是主题?

标签: ruby-on-rails ruby rails-activerecord


【解决方案1】:

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

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

另外,我建议将“注册”的模型、视图和控制器重写为“注册”。

【讨论】:

    【解决方案2】:

    您将用户添加到嵌套表单中,但忘记将它们添加到控制器参数白名单中。确保在 SubjectsController 的 subject_params 方法中正确定义了用户。

    来自下面我的cmets:

    @JackGoh:您的 subject_params 错误,但这与您的电子邮件字段未显示无关。可能,这将修复电子邮件不显示 @subject.enrolments.build(user: @user)。

    【讨论】:

    • 我在 SubjectsController & EnrolmentController 中添加了 subject_params 方法,users_attributes: [:id, :email, :_destroy]。仍然显示相同的错误。这是我的日志: 参数:{"utf8"=>"✓", "authenticity_token"=>"nrosOiJHQeOOFQ+wL2RS/FlONOUTl3YddN+JtE88vpQcZ+AqcL3O1FmDLUwdj5Znb88oLhP8IpZRJzbc3fYpdQ==", "subject"=>{"name"=>"123" "enrolments_attributes"=>{"1438596478232"=>{"users"=>{"id"=>"", "email"=>"123@123.com"}, "_destroy"=>"false"}} }, "commit"=>"创建主题"}
    • @JackGoh,您的注册模型具有“accepts_nested_attributes_for :user”而不是“users”。因此,您的 fields_for 应该有 :user 而不是 ":users。如果它不起作用,请将您的表单添加到问题中。
    • @JackGoh,它是 user_attributes: [ :id, :email, :_destroy] 而不是 users_attributes。
    • @JackGoh:您的 subject_params 错误,但这与您的电子邮件字段未显示无关。可能,这将修复电子邮件不显示 @subject.enrolments.build(user: @user)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2012-11-10
    相关资源
    最近更新 更多