0

我的应用程序有很多练习的课程。

当我查看课程时,我希望能够创建新的 Drills 并自动分配他们的课程 ID。

到目前为止,我所拥有的是课程的 show.html.erb 中的一个链接,该链接传入课程的 ID,如下所示:

<%= link_to t('.new', :default => t("helpers.links.new")),
          new_drill_path(lesson_id: @lesson.id), :class => 'btn' %>

这会将 course_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

但是,这段代码对我来说似乎很臭。似乎应该有一种更规范的方式来做到这一点,但我不知道它是什么。

4

2 回答 2

2

使用嵌套资源。像这样的东西:

# in config/routes.rb
resources :lessons do
  resources :drills
end

这将为您提供嵌套的 URL/路由,并且像lesson_drills_path这样的路由助手将Lesson-record 作为其参数来生成类似/lessons/:lesson_id/drills.

因此,您DrillsController将有权访问,params[:lesson_id]因为它会在 URL 中给出。这意味着您可以执行以下操作

# 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

在 CodeReview 上的这个答案中查看更多信息,并检查那里的链接

于 2013-04-15T18:13:26.463 回答
1

我不确定您要做什么,但请阅读嵌套资源。您的新操作应如下所示:

def new
  @lesson = Book.find(params[:lesson_id])
  @drill = @lesson.drills.build
end
于 2013-04-15T18:12:06.727 回答