我有课程模型和课程模型。当我在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 :(得分: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;可能会受到意见。但是,鉴于你的简短描述,筑巢路线似乎是一个伟大的想法。