如何防止硬编码下面的代码?

时间:2017-09-19 03:13:10

标签: ruby-on-rails ruby

我有课程模型和课程模型。当我在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进行硬编码?

1 个答案:

答案 0 :(得分:0)

不,不要硬编码。它应该是:

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

您应该在与包含上述代码的视图相关联的任何操作中实例化@course

所以,让我们说,例如,@course的id为2.然后,

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

&#34;哪个更好&#34;可能会受到意见。但是,鉴于你的简短描述,筑巢路线似乎是一个伟大的想法。