2013-07-30 102 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 %>