2012-01-22 35 views
1

我已經通過railscast 270併爲用戶實現了基本註冊表單(在此應用程序中名爲players)。表單工作正常,但是當我嘗試通過json進行身份驗證時,出現錯誤。有想法該怎麼解決這個嗎?通過JSON失敗的Rails 3.1身份驗證

POST請求http://localhost:3000/players與身體:

{ 
    "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引起的(和Rails的方式默認情況下將其解釋)。

如果你檢查你的日誌文件(日誌/ development.log),你會看到類似以下(allbeit用更少的換行符):

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" 
} 

正如你可以看到JSON數據包括兩次 - 一次在params散列的根中,再次作爲params中的一個鍵的值,使用(我認爲)控制器名稱作爲鍵。

因此,假設你有attr_accessible設置正確的,你可以做PlayersController#以下的一個創造:

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

OR 

@player = Player.new(params) 

顯然,這會妨礙在控制器處理您的相同動作的使用來自HTML表單提交的數據。爲了解決這個問題,你可以換的JSON如下:

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

這將使params[:player]有正確的信息,這才能利用現有的代碼

+1

你說得對,創建新的紀錄 - 感謝克里斯。我的json被搗毀了;我決定使用'@player = Player.new(params)'方法。 – Jack

+0

這只是救了我的命 – Kathan