2012-01-22 12 views
1

私はrailscast 270にアクセスし、ユーザー用の基本的なサインアップフォーム(このアプリケーションではplayersと呼ばれています)を実装しました。フォームは正常に動作しますが、jsonで試して認証するとエラーが発生します。どのようにこれを修正するための任意のアイデア?Rails 3.1認証でjsonが失敗する

体とhttp://localhost:3000/playersからPOST要求:

{ 
    "email": "[email protected]", 
    "username": "jaaaack", 
    "password": "abc123", 
    "password_confirmation": "abc123" 
} 

表示エラー:

<h2>Form is invalid</h2> 
<ul> 
    <li>Password digest can't be blank</li> 
    <li>Password can't be blank</li> 
</ul> 

players_controller.rb

class PlayersController < ApplicationController 
    def new 
    @player = Player.new 
    end 

    def create 
    @player = Player.new(params[:player]) 
    if @player.save 
     redirect_to root_url, :notice => "Signed up!" 
    else 
     render "new" 
    end 
    end 
end 

player.rb

class Player < ActiveRecord::Base 
    attr_accessible :username, :email, :password, :password_confirmation 

    has_secure_password 
    validates_presence_of :password, :on => :create 
    validates_presence_of :email 
    validates_presence_of :username 
    validates_uniqueness_of :email 
    validates_uniqueness_of :username 
end 

routes.rbを

get "sign_up" => "players#new", :as => "sign_up"  
resources :players, :only => [:create] 
root :to => 'home#index' 

答えて

3

私はあなたの問題は非常に適切でないあなたのJSONによって引き起こされる(及びレールは、デフォルトでそれを解釈する方法)されていると思います。

あなたのログファイル(ログ/ development.log)を調べる場合は、以下の(少ない改行とallbeit)のようなもの表示されます:あなたはJSONデータが二度含まれて見ることができるように

Processing by PlayersController#create as HTML 
Parameters: { 
    "email"=>"[email protected]", 
    "username"=>"jaaaack", 
    "password"=>"[FILTERED]", 
    "password_confirmation"=>"[FILTERED]", 
    "players"=>{ 
    "email"=>"[email protected]", 
    "username"=>"jaaaack", 
    "password"=>"[FILTERED]", 
    "password_confirmation"=>"[FILTERED]" 
    }, 
    "controller" => "players", 
    "action" => "create" 
} 

を - 一度paramsハッシュのルートに入れ、もう一度paramsのキーの値として、コントローラ名をキーとして使用します(私は思っています)。あなたはPlayersController#で、次のいずれかを実行可能性があるため、適切attr_accessibleセットアップを持っていることを考えるとこのように

は、作成:

@player = Player.new(params[:players]) 

OR 

@player = Player.new(params) 

明らかにこれは、処理のためのコントローラで同じアクションの使用を妨げるだろうHTMLフォーム送信からのデータ。次のようにこの問題を回避するには、あなたはJSONをラップすることができます:params[:player]を行います

{ "player": 
    { 
    "email": "[email protected]", 
    "username": "jaaaack", 
    "password": "abc123", 
    "password_confirmation": "abc123" 
    } 
} 

あなたは正確に正しい

+1

既存のコードを使用して新しいレコードを作成するために、それに正しい情報を持っている - のおかげでクリス。私のjsonはうんざりしていた。私は '@player = Player.new(params) 'アプローチを使うことに決めました。 – Jack

+0

これはちょうど私の人生を救った – Kathan

関連する問題