2017-09-19 39 views
0

我有一個課程模型和一個課程模型。當我在我的route.rb中嵌套這兩個模型時,我會得到以下路徑。如何防止硬編碼下面的代碼?

 course_lessons GET /courses/:course_id/lessons(.:format)   lessons#index 
        POST /courses/:course_id/lessons(.:format)   lessons#create 
    new_course_lesson GET /courses/:course_id/lessons/new(.:format)  lessons#new 
    edit_course_lesson GET /courses/:course_id/lessons/:id/edit(.:format) lessons#edit 
     course_lesson GET /courses/:course_id/lessons/:id(.:format)  lessons#show 
        PATCH /courses/:course_id/lessons/:id(.:format)  lessons#update 
        PUT /courses/:course_id/lessons/:id(.:format)  lessons#update 
        DELETE /courses/:course_id/lessons/:id(.:format)  lessons#destroy 
      courses GET /courses(.:format)        courses#index 
        POST /courses(.:format)        courses#create 
      new_course GET /courses/new(.:format)       courses#new 
     edit_course GET /courses/:id/edit(.:format)     courses#edit 
       course GET /courses/:id(.:format)       courses#show 
        PATCH /courses/:id(.:format)       courses#update 
        PUT /courses/:id(.:format)       courses#update 
        DELETE /courses/:id(.:format)       courses#destroy 

有了這個,我似乎有硬編碼在我看來文件COURSE_ID <li><%= link_to "new lesson", new_course_lesson_path(course_id: 1) %></li>創造屬於某一課程的一課。

但是,當我不在我的route.rb文件中嵌套課程和課程時,我可以前往new.html.rb文件獲取課程並創建課程,然後爲課程分配course_id 。

但我覺得嵌套這兩個資源比分離它們要乾淨得多。

哪個更好?有沒有辦法可以防止硬編碼course_id?

回答

0

不,不要硬編碼。它應該是:

<li> 
    <%= link_to "new lesson", new_course_lesson_path(@course) %> 
</li> 

而且你應該實例@course在任何操作與包括上面的代碼視圖相關聯。

所以,讓我們說,例如起見,即@course有2.然後一個id,

<%= link_to "new lesson", new_course_lesson_path(@course) %> 

將創建一個鏈接,點擊後,路線:

/courses/2/lessons/new 

現在,有一些不同的方法可以做到這一點。舉例來說,假設您的link_to位於courses#show操作的視圖中。在這種情況下,您的params將包含當前課程的id值。如果這是id=2的課程,那麼你應該有params[:id] = 2。在這種情況下,你可以這樣做:

<%= link_to "new lesson", new_course_lesson_path(id: params[:id]) %> 

在這種情況下,你是不是實例@course。這是好的。您可以通過任何方式告訴Rails您想要的內容與您的上下文最匹配。這將再次給一個鏈接,點擊後,路線:

/courses/2/lessons/new 

「哪個更好」可能是受到輿論。但是,鑑於你的簡要描述,嵌套路線似乎是一個偉大的想法。

+0

哦,好吧,所以我必須在我的lessons_controller.rb中實例化@course。這個實例背後的原因是什麼? – joshua