我正在传入: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: <%= f.fields_for :test_runs do |builder| %>
12:
13: Test <%= @tests[@i].id %><br><br>
14:
15: <%= render "partial", :f => builder %>
16: <hr>
显然,这意味着创建控制器没有获得params [:number],因此表单提交中断。我的创建功能有什么问题吗?
参数:{“utf8”=&gt;“✓”,“authenticity_token”=&gt;“/ vbOcFozTEAvoa03OUBfyxJbJ9AQp8m8yA04LkxlRE8 =”,“test_suite_run”=&gt; {“test_runs_attributes”=&gt; {“0”=&gt; {“ test_id“=&gt;”1“,”machine_id“=&gt;”“,”date“=&gt;”2012-07-09 15:59:53 -0700“,”status“=&gt;”“,”结果“=&gt;”“},”1“=&gt; {”test_id“=&gt;”3“,”machine_id“=&gt;”“,”日期“=&gt;”2012-07-09 15:59: 53 -0700“,”status“=&gt;”“,”result“=&gt;”“},”2“=&gt; {”test_id“=&gt;”6“,”machine_id“=&gt;”“, “date”=&gt;“2012-07-09 15:59:53 -0700”,“status”=&gt;“”,“result”=&gt;“”},“3”=&gt; {“test_id” =&gt;“7”,“machine_id”=&gt;“”,“date”=&gt;“2012-07-09 15:59:53 -0700”,“status”=&gt;“”,“结果”= &gt;“”}},“date”=&gt;“2012-07-09 15:59:53 -0700”},“commit”=&gt;“提交”,“操作”=&gt;“创建”,“控制器 “=&gt;” 中test_suite_runs“}
仔细研究一下,它只是我表格中的所有text_input字段。
答案 0 :(得分:0)
你做的事情非常奇怪。不是将@test_suite_num
分配给实例变量并放入getter方法(这非常笨拙和奇怪),而是完全摆脱before_filter
和方法。事实上,甚至不要使用@test_suite_num
因为它看起来不像你正在使用它。
相反,只使用与您previous question相同的params[:number]
。
如果这不起作用,请在您的创建操作中执行puts params.to_s
,并告诉我们您提交表单时会发生什么。
(另外,作为脚注:查看Ruby中的实例变量,因为它看起来像是在滥用它们。)