我已经通过railscast 270并为用户实施了一个基本注册表单(在此应用中称为players
)。表单工作正常,但是当我尝试通过json进行身份验证时,我会收到错误。关于如何解决这个问题的任何想法?
POST
请求http://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
的routes.rb
get "sign_up" => "players#new", :as => "sign_up"
resources :players, :only => [:create]
root :to => 'home#index'
答案 0 :(得分:3)
我认为你的问题是由你的json不正确引起的(并且rails默认解释它的方式)。
如果你检查你的日志文件(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数据包含两次 - 一次在params哈希的根目录中,并再次作为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]
中包含正确的信息,以便使用现有代码创建新记录