将参数传递(和使用)到控制器的“新”操作

时间:2013-04-15 17:51:14

标签: ruby-on-rails ruby ruby-on-rails-3

我的应用程序有经验丰富的课程。

当我查看课程时,我希望能够创建新的练习并自动分配他们的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

然而,这段代码对我来说似乎很臭。似乎应该有更多的轨道方式来做它,但我无法弄清楚它是什么。

2 个答案:

答案 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