有没有办法通过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
答案 0 :(得分:0)
您是否尝试在许可列表中添加def grad_params
params.require(:grad).permit(:name, :min, :max, :school_id, :course_ids)
end
?
像这样:
compiling on my system