Ruby On Rails:使用创建控制器函数中新控制器函数的参数

我传入:number作为参数,然后将其分配给before_filter控制器中的变量@test_suite_num。

在我在控制器中的new函数中,我使用变量@test_suite_num来过滤名为Test的表,以获取id为@test_suite_num的条目的计数。 我使用此计数生成适当数量的子资源test_run

我为create做同样的事情,但由于某些原因,每当我在依赖@test_suite_num的表单中使用这些变量时,我都会收到nil错误。 我假设因为create从不接受参数,所以变量永远不会被初始化。 如何在create函数中使用@test_suite_num?

控制器代码:

 before_filter :get_number, :only => [:new, :create] def get_number @test_suite_num = params[:number] end 

 def new @test_suite_run = TestSuiteRun.new @tests = Test.find(:all, :conditions => { :test_suite_id => @test_suite_num }) @tests.count.times do test_run = @test_suite_run.test_runs.build end end 

创建

 def create @test_suite_run = TestSuiteRun.new(params[:test_suite_run]) @tests = Test.find(:all, :conditions => { :test_suite_id => @test_suite_num }) @tests.count.times do test_run = @test_suite_run.test_runs.build(params[:test_suite_run]) end if @test_suite_run.save flash[:success] = "Run Added Succesfully" redirect_to test_suite_runs_path(@test_suite_run) else render 'new' end end 

编辑:

我刚开始使用RoR,所以我的风格非常混乱。 但是我的问题仍然存在。 我的问题是,在我的表单中,我正在使用@tests,它使用我传入的参数进行初始化。我可以查看表单,但是当我点击提交时,我得到:

 Showing /Users/vsp/Documents/rails_projects/web_db/app/views/test_suite_runs/_form.html.erb where line #13 raised: Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id Extracted source (around line #13): 10: 11:  12: 13: Test 

14: 15: builder %> 16:

显然这意味着创建控制器没有获得params [:number],因此表单提交中断。 我的创建function有什么问题吗?


参数:{“utf8”=>“✓”,“authenticity_token”=>“/ vbOcFozTEAvoa03OUBfyxJbJ9AQp8m8yA04LkxlRE8 =”,“test_suite_run”=> {“test_runs_attributes”=> {“0”=> {“test_id”=>“1”, “machine_id”=>“”,“date”=>“2012-07-09 15:59:53 -0700”,“status”=>“”,“结果”=>“”},“1”=> {“test_id”=>“3”,“machine_id”=>“”,“date”=>“2012-07-09 15:59:53 -0700”,“status”=>“”,“结果”= >“”},“2”=> {“test_id”=>“6”,“machine_id”=>“”,“date”=>“2012-07-09 15:59:53 -0700”,“状态“=>”“,”结果“=>”“},”3“=> {”test_id“=>”7“,”machine_id“=>”“,”日期“=>”2012-07-09 15 :59:53 -0700“,”status“=>”“,”result“=>”“}},”date“=>”2012-07-09 15:59:53 -0700“},”commit“ >>“提交”,“操作”=>“创建”,“控制器”=>“test_suite_runs”}

仔细看看,这只是我表单中的所有text_input字段。

你做的事情很奇怪。 不是将@test_suite_num分配给实例变量并放入getter方法(这非常笨拙和奇怪),而是完全摆脱before_filter和方法。 事实上,甚至不使用@test_suite_num因为它看起来不像你正在使用它。

相反,只使用params[:number]就像你之前的问题一样 。

如果这不起作用,请在创建操作中添加puts params.to_s ,并向我们展示提交表单时会发生什么。

(另外,作为脚注:查看Ruby中的实例变量,因为它看起来像是在滥用它们。)