Json 无法传递参数数据以创建用户

Json 无法传递参数数据以创建用户,json,ruby-on-rails-3,get,Json,Ruby On Rails 3,Get,我有一个rails应用程序,它接受json请求来创建用户。注册基本上是一种获取。传入此url时无法创建用户http://localhost:3000/sign_up.json?username=chalam&email=holy@yahoo.com&name=chalami&password=chalami 我知道我在公开传递密码,但这不是我关心的问题。我检查了日志,这就是我看到的 Started GET "/sign_up.json?username=chalam&email=holy

我有一个rails应用程序,它接受json请求来创建用户。注册基本上是一种获取。传入此url时无法创建用户
http://localhost:3000/sign_up.json?username=chalam&email=holy@yahoo.com&name=chalami&password=chalami
我知道我在公开传递密码,但这不是我关心的问题。我检查了日志,这就是我看到的

Started GET "/sign_up.json?username=chalam&email=holy@yahoo.com&name=chalami&password=[FILTERED]" for 127.0.0.1 at 2013-05-28 10:37:37 +0700
Processing by UsersController#create as JSON
Parameters: {"username"=>"chalam", "email"=>"holy@yahoo.com", "name"=>"chalami", "password"=>"[FILTERED]"}
(0.1ms)  begin transaction
User Exists (0.1ms)  SELECT 1 AS one FROM "users" WHERE "users"."username" IS NULL LIMIT 1
User Exists (0.0ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" IS NULL LIMIT 1
(0.0ms)  rollback transaction
(0.0ms)  begin transaction
CACHE (0.0ms)  SELECT 1 AS one FROM "users" WHERE "users"."username" IS NULL LIMIT 1
CACHE (0.0ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" IS NULL LIMIT 1
(0.0ms)  rollback transaction
Completed 200 OK in 6ms (Views: 0.1ms | ActiveRecord: 0.3ms)
正如您所看到的,虽然参数
参数:{“username”=>“chalam”,“email”=>“holy@yahoo.com“,”name“=>”chalami“,”password“=>”[过滤]”}
清楚地显示正在传递参数,这些参数没有输入数据库
缓存(0.0ms)从“users”中选择1作为“users”中的一个。“username”为空限制1
缓存(0.0ms)从“用户”中选择1,其中“用户”。“电子邮件”为空限制1
主要问题是参数中的数据未“用于”创建用户

需要注意的是,我可以通过终端中的控制台创建一个用户。我会尽量包括所有相关信息 rails版本:3.2.13和 我用的是thin而不是WEBBRICK

我的用户.rb

class User < ActiveRecord::Base
  attr_accessible :email, :name, :username
  attr_accessor :password
  before_save :encrypt_password

  validates_uniqueness_of :username, :email
  validates_presence_of :password, :on => :create
  validates_presence_of :email, :username

  def encrypt_password
  if password.present?
    self.password_salt = BCrypt::Engine.generate_salt
    self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
  end
  end

  def self.authenticate(username, password)
user = find_by_username(username)
if(user && user.password_hash == BCrypt::Engine.hash_secret(password,  user.password_salt))
    user
else
    nil
end
  end
end
class用户:create
验证是否存在:电子邮件、:用户名
def加密密码
如果密码存在?
self.password\u salt=BCrypt::Engine.generate\u salt
self.password\u hash=BCrypt::Engine.hash\u secret(密码、密码)
终止
终止
def自我验证(用户名、密码)
用户=通过用户名(用户名)查找
if(user&&user.password\u hash==BCrypt::Engine.hash\u secret(password,user.password\u salt))
使用者
其他的
无
终止
终止
终止
我的控制器

class UsersController < ApplicationController
respond_to :json
    def new
 @user = User.new
    end

    def create
  @user = User.new(params[:user])
  @user.save
  if @user.save
    respond_to do |format|
        format.json { render :json => {:status => "200", :message => "Signed up successfully"}}
    end
  else
    respond_to do |format|
         puts @user.errors.inspect 
        format.json { render :json => {:status => "400", :message => "Failed"}}
    end
  end
  end

  def index
@user = User.all
render :json =>@user
  end
end
class UsersController{:status=>“200”,:message=>“已成功注册”}
终止
其他的
回应待办事项|格式|
放置@user.errors.inspect
format.json{render:json=>{:status=>“400”,:message=>“Failed”}
终止
终止
终止
def索引
@user=user.all
render:json=>@user
终止
终止

好的,所以我想出了一个解决方案,我想我应该发布它,它可能会帮助人们

问题:虽然我可以通过
rails控制台

错误:

  • 我创建了一个GET路由来创建一个危及安全性的用户
  • 我将密码字段添加到
    attr\u accessor
    而不是
    attr\u accessible
  • 解决方案:

  • 将操作从GET更改为POST(在routes.rb中)。为了创建用户(用于帖子),我使用了
    curl
    。在我的例子中,我的
    curl
    语句是
    curl-v-H“Accept:application/json“-H”内容类型:application/json“-X POST-d'{“user”:{“name”:“name”,“username”:“username”,“email”:email@email.com“,“密码”:“app123”}”http://localhost:3000/sign_up
    。这里有一篇关于

  • 2.在我的用户模型中,我包括了
    attr\u accessor:password
    以及
    attr\u accessible:password

    1)您的控制器代码在哪里?2) 请格式化您的代码,使其不仅仅是代码汤。3) 您正在根据GET请求创建一个资源,这破坏了Rails为您设置的帮助您构建RESTful应用程序的环境。4) 您正在以透明的方式传递密码,不经意地妨碍了您自己的安全。请参阅#3。顺便说一句,Rails已经支持使用
    has_secure_password
    安全散列密码,以确保您不会犯很多错误(比如每次保存时都重新散列密码)。您使用Desive gem吗?@visnu否我没有使用Desivegem@coreyward我已经发布了控制器代码