У меня есть приложение rails, которое принимает запрос json для создания пользователя. Знак_учка в основном является GET. Я не могу создать пользователя, когда я передаю этот url http://localhost:3000/sign_up.json?username=chalam&[email protected]&name=chalami&password=chalami
Я знаю, что я передаю пароль в открытую, но это меня не касается. я проверил журналы и это то, что я вижуНевозможно передать данные параметров для создания пользователя
Started GET "/sign_up.json?username=chalam&[email protected]&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"=>"[email protected]", "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)
Как вы можете видеть, хотя параметр Parameters: {"username"=>"chalam", "email"=>"[email protected]", "name"=>"chalami", "password"=>"[FILTERED]"}
ясно показывают, что параметры пропускают, они не вводятся в базу данных 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
Основная проблема заключается данные из Params не используется «для создания пользователя»
Следует отметить, что я могу создать пользователя через консоль в терминале. Я буду стараться, чтобы включить всю необходимую информацию рельсы версия: 3.2.13 и Я использую тонкие вместо WEBBRICK
Мой user.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 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
1) Где ваш контроллер код? 2) Пожалуйста, отформатируйте свой код, чтобы он не был просто супом кода. 3) Вы * создаете * ресурс по запросу * GET *, подрывая среду, в которой у Rails есть настройка, позволяющая вам создавать RESTful-приложения. 4) Вы передаете пароль в чистом виде, препятствуя собственной безопасности, небрежно. См. № 3. – coreyward
Кстати, Rails уже поддерживает безопасные хэшированные пароли с 'has_secure_password', чтобы убедиться, что вы не делаете кучу ошибок, которые вы совершаете (например, повторное хеширование вашего пароля при каждом сохранении). – coreyward
Вы используете драгоценный камень? – visnu