2013-07-30 30 views
3

我想我会问一个2部分的问题;如果这应该分成2个问题,我的道歉。simple_form与嵌套属性

首先,我想存储的课程为course表(课程名称,讲师,START_TIME,END_TIME,等...),这将有course_dayscourse_idday与的一天相当于一个ActiveRecord关系周=> 1为星期日,2为星期一等)。我的最终目标是在FullCalendar中将它们显示为一个时间表,这就是为什么我认为将coursecourse_days分隔成两个具有ActiveRecord关系的表格最好。 使用Rails,这是实现这一目标的好方法吗?

如果是这样,其次,我使用简单的形式将以下数据添加到2个表中:coursecourse_days。我想我正在接近。我只是有一些困难,加上course_days(例如,如果“星期一”,“星期二”和“星期四”检查3个独立的行会被添加到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 

 

#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 

任何帮助将不胜感激!

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

编辑2

所以,从本质上讲,当表单提交,我想数据库表看起来是这样的:

courses: id => 14, name => Bio 101, start_time => 08:00:00, end_time 09:00:00 

    course_days: id => 11, course_id => 14, day => 1 (For monday) 
    course_days: id => 12, course_id => 14, day => 3 (For wednesday) 
    course_days: id => 13, course_id => 14, day => 5 (For friday) 
+0

好像是好主意,你关心的是什么?或问题? – juanpastas

+0

嗨@juanpastas,我更新了我的问题。 – Dodinas

+0

你会对这个宝石感兴趣吗:https://github.com/ryanb/nested_form?我认为它可以帮助你实现你想要的。我要做的是...当用户选中“日复选框”时,它会在隐藏的“link_to_add”按钮上单击(使用coffeescript),并按照相应的日期值预先筛选新的嵌套属性之一。你认为这个宝石可以帮你吗?你想让我写一个详细的答案吗? – Kulgar

回答

2

请考虑到有另一个表,将需要从数据库提取的行。

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

我建议你有days的课程模型。此列将使用逗号分隔值保存选定日期。

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

+1

我认为这是一个好的开始。您也可以使用easy_roles gem并扮演一个角色.. easy_roles gem因此使用了一个位掩码。在github上检查它。您只需要一个db属性并且不需要关联。只要在你的日子上下文中使用角色。 – Mattherick

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

但实际上,我无法解释究竟发生了什么。

虽然我不确定。

+0

谢谢,这看起来更接近一点。它返回这个数组:[course_days_attributes] [0] [day]:0 course [course_days_attributes] [0] [day]:1 course [course_days_attributes] [1] [day]:0 course [course_days_attributes] [1] [天]:1 课程[course_days_attributes] [2] [day]:0 course [course_days_attributes] [3] [day]:0 course [course_days_attributes] [4] [day]:0 course [在数据库中,它提交了7行,所有行都使用了正确的'course_id',但随后是'day'列只是一个1或0.任何其他想法呢? – Dodinas

+0

我不知道,这似乎与'boolean'有关。查看我的更新。 – juanpastas

+0

现在它正在传递'course [course_day_ids] []:1 course [course_day_ids] []:3'之类的东西,它看起来像试图与实际的'course_days'' id'关联。我再次更新了我的问题,以显示我在数据库方面想实现的目标。 – Dodinas

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