我的应用程序有经验丰富的课程。
当我查看课程时,我希望能够创建新的练习并自动分配他们的lesson_id。
到目前为止,我所拥有的是课程的show.html.erb中的一个链接,它传递了课程的ID,如下所示:
<%= link_to t('.new', :default => t("helpers.links.new")),
new_drill_path(lesson_id: @lesson.id), :class => 'btn' %>
这会将lesson_id添加到params散列中。我想出了如何通过在我的控制器中执行此操作将参数传递到练习中:
def new
@drill = Drill.new
params.each do |key, value|
method = key.to_s + '='
method.to_sym
if @drill.respond_to? method
@drill.send method, value
end
end
end
然而,这段代码对我来说似乎很臭。似乎应该有更多的轨道方式来做它,但我无法弄清楚它是什么。
答案 0 :(得分:2)
使用nested resources。像这样:
# in config/routes.rb
resources :lessons do
resources :drills
end
这将为您提供嵌套的URL /路由,以及lesson_drills_path
之类的路由助手,它们将Lesson
- 记录作为其参数,以生成类似/lessons/:lesson_id/drills
的路径。
您的DrillsController
因此可以访问params[:lesson_id]
,因为它会在网址中提供。这意味着你可以做像
# POST /lesson/:lesson_id/drills/
def create
@lesson = Lesson.find(params[:lesson_id])
@drill = @lesson.drills.new(params[:drill])
if @drill.save
..
else
..
end
end
在this answer上查看有关CodeReview的详情,并查看其中的链接
答案 1 :(得分:1)
我不确定你要做什么,但请阅读嵌套资源。您的新操作应该类似于:
def new
@lesson = Book.find(params[:lesson_id])
@drill = @lesson.drills.build
end