0

:numberをパラメーターとして渡し、それをコントローラーの変数@test_suite_numに割り当てますbefore_filter

コントローラのnew関数では、変数@test_suite_numを使用して、名前が付けられたテーブルをフィルタリングし、TestIDが@test_suite_numと一致するエントリの数を取得します。このカウントを使用して、適切な数の子リソースを生成しますtest_run

私は同じことをしcreateますが、に依存するフォームでこれらの変数を使用するたびに、何らかの理由でnilエラーが発生します@test_suite_num。createがパラメーターを受け取ることはないため、変数が初期化されることはないと想定しています。関数で@test_suite_numを使用するにはどうすればよいcreateですか?

コントローラーコード:

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" => "✓"、 "authenticity_token" => "/ vbOcFozTEAvoa03OUBfyxJbJ9AQp8m8yA04LkxlRE8 ="、 "test_suite_run" => {"test_runs_attributes" => {"0" => {"test_id" = "machine_id" => ""、 "date" => "2012-07-09 15:59:53 -0700"、 "status" => ""、 "result" => ""}、 "1" => {"test_id" => "3"、 "machine_id" => ""、 "date" => "2012-07-09 15:59:53 -0700"、 "status" => ""、 "result" = > ""}、 "2" => {"test_id" => "6"、 "machine_id" => ""、 "date" => "2012-07-09 15:59:53 -0700"、"ステータス"=>""、 "result" => ""}、 "3" => {"test_id" => "7"、 "machine_id" => ""、 "date" => "2012-07-09 15:59: 53 -0700 "、" status "=>" "、" result "=>" "}}、" date "=>" 2012-07-09 15:59:53 -0700"}、" commit "=>" Submit "、" action "=>" create "、" controller "=>" test_suite_runs "}"Submit"、 "action" => "create"、 "controller" => "test_suite_runs"}"Submit"、 "action" => "create"、 "controller" => "test_suite_runs"}

これを見ると、これは私のフォームのすべてのtext_inputフィールドです。

4

1 に答える 1

0

あなたは本当に奇妙なことをしています。インスタンス変数に代入して getter メソッドを配置する代わりに(これは非常に厄介で奇妙です)、それとメソッドを完全@test_suite_numに取り除きます。before_filter実際、@test_suite_num使っているようには見えないので使わないでください。

代わりに、前の質問params[:number]で使用したのと同じように使用してください。

これが機能しない場合はputs params.to_s、作成アクションで a を実行し、フォームを送信したときに何が起こるかを示してください。

(また、脚注として: Ruby のインスタンス変数を調べてください。それらを誤用しているようです。)

于 2012-07-09T22:34:34.770 に答える