1

私はrailscast270を使用し、ユーザー向けの基本的なサインアップフォームを実装しました(このアプリではplayers)。フォームは正常に機能しますが、jsonで認証しようとすると、エラーが発生します。これを修正する方法について何かアイデアはありますか?

POSThttp://localhost:3000/playersボディでリクエスト:

{
  "email": "aaaa@baaab.com",
  "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

ルート.rb

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

1 に答える 1

3

あなたの問題は、あなたのjsonが正しくないことが原因であると思います(そして、レールがデフォルトで解釈する方法)。

ログ ファイル (log/development.log) を調べると、次のような内容が表示されます (ただし、改行は少ないですが)。

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

ご覧のとおり、json データは 2 回含まれています。1 回目は params ハッシュのルートに、もう 1 回は params のキーの値として、コントローラー名をキーとして使用します (と思います)。

したがって、適切に attr_accessible をセットアップした場合、PlayersController#create で次のいずれかを実行できます。

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

OR

@player = Player.new(params)

明らかに、これにより、コントローラーで同じアクションを使用して、HTML フォーム送信からのデータを処理することが妨げられます。これを回避するには、次のように JSON をラップします。

{ "player":
  {
    "email": "aaaa@baaab.com",
    "username": "jaaaack",
    "password": "abc123",
    "password_confirmation": "abc123"
  }
}

params[:player]既存のコードを使用して新しいレコードを作成するために、正しい情報が含まれるようになります

于 2012-01-22T16:13:12.937 に答える