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

时间:2012-07-09 22:26:54

标签: 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: <%= 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字段。

1 个答案:

答案 0 :(得分:0)

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

相反,只使用与您previous question相同的params[:number]

如果这不起作用,请在您的创建操作中执行puts params.to_s,并告诉我们您提交表单时会发生什么。

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