2017-02-10 10 views
0

私はRuby on Railsを実践するためにおもちゃのウェブアプリを開発していますが、私はその文書では理解できなかった問題にぶつかってきました。基本的には、タスクを作成してユーザーに関連付けるフォームがありますが、フォームは送信時にレコードが保存されていない場合に302エラーが発行されます。Rails Create 302 Error

は、私は2つのモデル、ユーザを持ち、タスク ユーザー

class User < ApplicationRecord 
    has_many :tasks 
end 

タスク

class Task < ApplicationRecord 
    belongs_to :article 
end 

アイデアはシンプルで、ユーザーは多くのタスクを持つことができます。これらの移行は正常に動作しています。

Iタスクを作成するための(部分)フォーム作成した:

<%= form_for([@currentUser, @currentUser.tasks.build]) do |f| %> 
<p> 
    <%= f.label :label %> 
    <%= f.text_field :label %> 
    <%= f.label :complete %> 
    <%= f.check_box :complete%> 

    <%= f.submit %> 
</p> 
<% end %> 

_compact_form.html.erb

が、これは自明ダッシュボードコントローラまで配線されるダッシュボードビューに取り付けられています。 :

class DashboardController < ApplicationController 
    def index 
     @currentUser = User.find(1) 
    end 
end 

これまでのところかなり単純です。私のタスクコントローラには、これまでの作成を管理するためのいくつかのメソッドがあります。

タスクコントローラ:

class TasksController < ApplicationController 
    def new 
    end 

    def show 
     @user = User.find(params[:user_id]) 
    end 

    def create 
     @user = User.find(params[:user_id]) 
     @task = @user.tasks.create(task_params) 

     redirect_to '/' 

    end 

    private 
    def task_params 
     params.require(:task).permit(:label, :complete) 
    end 
end 

そして今、我々は、私は混乱のポイントにいます。私は手動でデータベースにタスクを挿入しましたが、それを正常に取得できますが、何らかの理由で作成ルートがHTTP 302エラーを出しています。その作成した経路は、そこに表示され、それが正しいように見える

resources :users do 
     resource :tasks 
    end 

    root 'dashboard#index' 
    get 'dashboard/index' 

とレーキルート出力

  Prefix Verb URI Pattern       Controller#Action 
new_user_tasks GET /users/:user_id/tasks/new(.:format) tasks#new 
edit_user_tasks GET /users/:user_id/tasks/edit(.:format) tasks#edit 
    user_tasks GET /users/:user_id/tasks(.:format)  tasks#show 
       PATCH /users/:user_id/tasks(.:format)  tasks#update 
       PUT /users/:user_id/tasks(.:format)  tasks#update 
       DELETE /users/:user_id/tasks(.:format)  tasks#destroy 
       POST /users/:user_id/tasks(.:format)  tasks#create 
      users GET /users(.:format)      users#index 
       POST /users(.:format)      users#create 
     new_user GET /users/new(.:format)     users#new 
     edit_user GET /users/:id/edit(.:format)   users#edit 
      user GET /users/:id(.:format)     users#show 
       PATCH /users/:id(.:format)     users#update 
       PUT /users/:id(.:format)     users#update 
       DELETE /users/:id(.:format)     users#destroy 
      root GET /         dashboard#index 
dashboard_index GET /dashboard/index(.:format)   dashboard#index 

:私はそうのような私のルートを設定しています。

今、最も奇妙な部分です!私は自分のフォームを使用している場合、これは私がコンソールに表示するものである。

User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] 
    (0.1ms) begin transaction 
    (0.1ms) commit transaction 

これは#メソッドを作成し、私の仕事で正しいコードであるように思われるので、データが起こっているところ私はかなり混乱しています。誰かがこれをデバッグするための次のステップにいくつかの光を当てることができますか?私は別のフォームを作成し、thisガイドの例を使って作業する時間を費やしましたが、私はラインのどこかでミスをしたように見えます。それはリダイレクトに与える応答の種類を知らないので、それはあなたのクライアントが行くlocationヘッダフィールドを処理し想定しているので

+0

HTTP 302は、一時的に正しい行動はあなたが 'redirect_to「/」を'呼び出しているあなたの 'create'方式であるためである、リダイレクトされることを意味します。 – danirod

+0

新しく作成されたレコードを削除する必要がありますか?データベースが更新されていないと付け加えておきます。 – Grisk

+0

あなたはのparamsはあなたが私は問題はHTTPエラーについてであることができなかったことを実感しましたので、私はこの答えを受け入れるつもりです –

答えて

1

あなたはrespond_toブロック内のあなたのリダイレクトを宣言する必要があり、フォーマット宣言理由なく302の状態応答をリダイレクト応答で、あなたはこのような何かをする必要があります

respond_to do |format| 
    format.html { redirect_to '/' } 
end 

302ステータスがエラーではない、それはリダイレクトの指標であるとリダイレクト先は、HTTPヘッダとして送信されています。限り、保存されていないモデルとして、より良いログ結果を提供する必要があります、それは、許容されていないパラメータ、検証、データベースエラーなどの問題の膨大な数になる可能性があります...

+0

を喜ば投稿できます。実際の問題はモデルの宣言にありました。私が投稿したコードで、TaskはUserの代わりにArticleに関連していることに注意してください。これは最後のプロトタイプのホールドオーバーで、変更を忘れてしまいました。残念なことに、302は私を驚かせ、私はまったく間違ったデバッグパスを辿りました。 – Grisk

関連する問題