通过form_for更新其他字段的多对多关系

时间:2016-01-29 01:40:07

标签: ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord nested-form-for

有没有办法通过form_for?

更新相对于多对多关联的字段

论文是我的模特:

  class Grad < ActiveRecord::Base
    belongs_to :school
    has_many :grad_courses
    has_many :courses, through: :grad_courses
    accepts_nested_attributes_for :grad_courses, :courses
  end

  class Course < ActiveRecord::Base
    belongs_to :school
    has_many :grad_courses
    has_many :grads, through: :grad_courses
  end

  class GradCourse < ActiveRecord::Base
    belongs_to :grad
    belongs_to :course
  end

以下是具有额外属性(学期)的多对多迁移:

  create_table "grad_courses", force: :cascade do |t|
    t.integer  "grad_id"
    t.integer  "course_id"
    t.integer  "semester"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

我要做的是使用表单集合动态添加和更新与学期信息的关系(使用form_for并选择)。

<%= form_for @grad, html: {class: "form-horizontal"} do |f| %>
    ...    
       <% (1..@grad.max).each do |semester| %>
            <div class="form-group">
                <%= f.label :course_ids, "#{semester}º semestre", class: "col-sm-2 control-label"  %>
                <div class="col-sm-10">
                  <%= f.collection_select :course_ids, @courses, :id, :name, {include_blank: true}, {multiple: true, :class=>'chosen-select form-control'} %>
                </div>
            </div>
        <% end %>  
...   
    <% end %>

这样,它就是创建和更新grad_courses,但没有学期。

我尝试过很多东西,但没有成功。

我可以直接管理学期的信息,例如:http://stackoverflow.com/questions/2168442/many-to-many-relationship-with-the-same-model-in-rails#=

我可以传递一个带有隐藏字段的数组,并手动管理表单,但这需要花费太多工作,所以我想知道是否有一种简单的方法可以做到这一点。

像:grad_course [:course_id] [:semester] in:grad params?有可能吗?

grad_course_controller:

      def update
        respond_to do |format|
          if @grad.update(grad_params)
            format.html { redirect_to @grad, notice: 'Cursos adicionados com sucesso' }
          else
            format.html { render :edit }
          end
        end
      end

      private
        def set_grad
          @grad = Grad.find(params[:id])
        end

        def set_courses
           @courses = Course.where(school_id: @grad.school_id) 
           @gc = GradCourse.where(grad_id: @grad.id)
        end
list through.
        def grad_params
          params.require(:grad).permit(:name, :min, :max, :school_id, course_ids: [] )
        end

更新

我一直试图用Peter的建议来解决这个问题,所以我尝试了nested_attributes和fields_for。但我也遇到了问题。

每个学期我需要一个collection_sellect(从1到Grad.max编号),其中选项将是该学期可用的课程(@courses),对于选定的课程,需要创建或更新grad_course关系

field_for的问题是为每个grad_course关系生成一个字段,并且因为每个字段与grad_course.id相关,所以我无法正确添加新字段。

以下是我用以下字段进行的尝试之一:

  <%= f.fields_for :grad_courses do |builder| %>
  <p>
    <%= builder.text_field :semester %><br />
    <%= builder.collection_select :course_id, @courses, :id, :name, {include_blank: true}, {multiple: true, :class=>'chosen-select form-control'} %>

  </p>
  <% end %>

在grad_controller中进行了这些更改:

def grad_params
  params.require(:grad).permit(:name, :min, :max, :school_id, course_ids: [], grad_courses_attributes: [:id, :course_id, :grad_id, :semester ])
end

1 个答案:

答案 0 :(得分:0)

您是否尝试在许可列表中添加def grad_params params.require(:grad).permit(:name, :min, :max, :school_id, :course_ids) end

像这样:

compiling on my system
相关问题