2012-01-22 2 views
1

Я прошел через railscast 270 и внедрил базовую форму регистрации для пользователей (в этом приложении под названием players). Формы работают нормально, но когда я пытаюсь аутентифицироваться над json, я получаю ошибки. Есть какие нибудь идеи как это починить?Rails 3.1 аутентификация через json failing

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 не будучи совсем правильно (и путь рельсы интерпретирует его по умолчанию).

Если вы проверяете файл журнала (журнал/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 и снова как значение для ключа в параметрах, используя (я думаю) имя контроллера в качестве ключа.

Таким образом, учитывая, что у вас есть 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