带有嵌套属性的simple_form

时间:2013-07-30 22:48:03

标签: ruby-on-rails simple-form nested-attributes

我想我会问一个由两部分组成的问题;如果这应该分成两个问题,我很抱歉。

首先,我试图将课程存储到course表(course_name,instructor,start_time,end_time等...)中,这些表与course_days具有ActiveRecord关系({{1和course_id对应于星期几=> 1表示星期日,2表示星期一等等...)。我的最终目标是将这些作为计划显示在FullCalendar中,这就是为什么我认为将daycourse分成两个具有ActiveRecord关系的表是最好的。 使用Rails,这是实现这一目标的好方法吗?

如果是这样,其次,我使用简单表单将以下数据添加到2个表:course_dayscourse。我想我越来越近了。我添加course_days时遇到了一些困难(例如,如果选中“星期一”,“星期二”和“星期四”,则会将3个单独的行添加到course_days

以下是我目前正在使用的内容:

course_days
  
#new.html.erb
<%= simple_form_for @course, html: { autocomplete: 'off' } do |f| %>
<%= f.input :title, label: 'Class Name', placeholder: 'Class Name' %>
<%= f.input :instructor, placeholder: "Instructor Name" %>
<%= f.input :instructor_email, placeholder: 'Instructor Email' %>
<%= f.input :building, placeholder: 'Building' %>
<%= f.input :room, placeholder: 'Room' %>
<%= f.input :semester do %>
    <%= f.select :semester_id, @semesters.map { |s| [s.name, s.id] } %>
<% end %>
<%= f.simple_fields_for :course_days do |p| %>
    <%= p.input :day, :as => :boolean %>
 <% end %>
<%= f.button :submit, :class => 'btn btn-primary' %>

#app/models/course.rb
class Course < ActiveRecord::Base
  has_many :course_days
  accepts_nested_attributes_for :course_days
end

#app/models/course_day.rb
class CourseDay < ActiveRecord::Base
  belongs_to :course
end

非常感谢任何帮助!

编辑: 我在上面的表格中遇到的问题: 1)如何生成带有指定属性的7个复选框,以确定它是星期一,星期二等? 2)使用嵌套属性,即使检查了多个复选框,也只向数据库提交一条记录。

修改2

因此,基本上,当提交该表单时,我希望数据库表看起来像这样:

#app/controllers/courses_controller.rb

  def new
   @course = Course.new
   7.times  { @course.course_days.build } #For 7 days of the week??
   @semesters = Semester.all() 
  end

 def create
   @course = Course.new(course_params)
   if @course.save
     redirect_to action: 'new'
     flash[:notice] = "Course Created."
   else
     render :new
   end
 end

 def course_params
  params.require(:course).permit!
 end

3 个答案:

答案 0 :(得分:2)

请考虑拥有另一个表,需要从数据库中获取这些行。

因此,当您要求课程时,您需要最多7次点击才能了解课程日期。

我建议你在课程模型中有days。此列将以逗号分隔的值保存选定的天数。

这样您就不需要accepts_nested_attributes_for。在这种情况下,您需要做的是使用before_validation回调使用复选框值填充Course.days列。

答案 1 :(得分:0)

我不确定,但是:

   7.times  { |i| @course.course_days.build day: i } #For 7 days of the week??

通过这种方式,您将拥有7个具有不同天数值的实例。您可以使用i+1从1开始。

我想这会发送类似的东西:

{
  "course" => {
    "course_days_attributes" =>{
      "0" => { "day" => "1"},
      "1" => { "day" => "5"},
    }
  }
}

尝试这只是为了测试,然后你可以重构:

<%= f.simple_fields_for :course_days do |p| %>
  <%= p.input :day, :as => :check_box, input_html: { value: f.object.course_days.day } %>
<% end %>

我不知道您是否可以使用p.object.day代替f.object.course_days.day。这应该是自动的。

我会尝试的另一件事是:

<%= f.simple_fields_for :course_days, f.object.course_days do |p| %>

但实际上我无法解释到底发生了什么。

虽然我不确定。

答案 2 :(得分:0)

首先,simple_form包含输入集合

所以

<%= f.input :semester do %>
  <%= f.select :semester_id, @semesters.map { |s| [s.name, s.id] } %>
<% end %>

你可以写成

<%= f.input :semester, collection: @semesters %>

其次,要将天数作为布尔值,您可以执行以下操作:

<%= f.simple_fields_for :course_days do |p| %>
  <%= p.input :day, collection: [['Monday',1],['Tuesday',2][so forth]], as: :check_boxes %>
<% end %>