2013-04-15 27 views
0

我的應用程序有許多訓練有許多演習。傳遞(並使用)參數到控制器的「新」動作

當我在看課程時,我希望能夠創建新的練習並自動分配他們的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

使用nested resources。事情是這樣的:

# 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 

見多了this answer在代碼審查,並檢查環節中有太多

1

我不完全確定你想要做什麼,但請閱讀嵌套資源。你的新動作應該是這樣的:

def new 
    @lesson = Book.find(params[:lesson_id]) 
    @drill = @lesson.drills.build 
end 
相關問題