【问题标题】:Rails 3.1 authentication over json failing基于 json 的 Rails 3.1 身份验证失败
【发布时间】:2012-01-22 14:51:23
【问题描述】:

我已经通过railscast 270 为用户实现了一个基本的注册表单(在这个名为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

播放器.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'

【问题讨论】:

    标签: ruby-on-rails json curl ruby-on-rails-3.1 railscasts


    【解决方案1】:

    我认为您的问题是由于您的 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] 拥有正确的信息,以便使用现有代码创建新记录

    【讨论】:

    • 你说得对——谢谢克里斯。我的 json 被搞砸了;我决定使用 `@player = Player.new(params)' 方法。
    • 这只是救了我的命
    猜你喜欢
    • 2021-06-19
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 2015-02-06
    • 1970-01-01
    • 2015-07-12
    相关资源
    最近更新 更多