2017-09-19 42 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