###前提・実現したいこと
UnityでC#を用いたクライアントサイドのアプリからユーザー情報を入力しJSONでrクエスト絵お送信し、サーバーサイドのRailsAPIに送られてきたリクエストをデコードして保存し、Deviseでユーザー登録する機能を作成しています。
クライアント側で送信されたリクエストを受け取った時、送られてきたJSONのリクエストがデコードされず、弾かれているという状態だと推測しています。
Rackやconfig/initializer.rbなどの知識がなく、特にサーバーサイドではどの部分でデコードを定義しているのか推測できません。
クライアントから送られててきたリクエストをサーバー側でparamsに変換し、ユーザーの認証が成功してパラメーターが保存できる形を目指しております。
###発生している問題・エラーメッセージ
<送信の結果>
Started POST "/users.json" for 127.0.0.1 at 2017-08-27 16:33:03 +0900
(36.9ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
(8.1ms) SELECT schema_migrations
.version
FROM schema_migrations
ORDER BY schema_migrations
.version
ASC
Processing by Users::RegistrationsController#create as JSON
Parameters: {"user"=>#<ActionDispatch::Http::UploadedFile:0x007fbc512dcdb8 @tempfile=#Tempfile:/var/folders/gx/dnngg3597rv4rm5bdwgdf7mr0000gn/T/RackMultipart20170827-2558-rap4gl.dat, @original_filename="user.dat", @content_type="application/octet-stream", @headers="Content-Type: application/octet-stream\r\nContent-disposition: form-data; name="user"; filename="user.dat"\r\n">, "Content-Type"=>"application/json; charset=UTF-8"}
User Load (13.0ms) SELECT users
.* FROM users
WHERE users
.name
IS NULL LIMIT 1
Completed 500 Internal Server Error in 38ms (ActiveRecord: 23.9ms)
NoMethodError (undefined method `permit' for #ActionDispatch::Http::UploadedFile:0x007fbc512dcdb8
Did you mean? print):
###該当のソースコード
####<model/User.rb>
lass User < ApplicationRecord
include ActiveModel::Serialization
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
validates :name, uniqueness: true
validates :access_token, uniqueness: true, allow_nil: true
has_many :musicdictation_scores
def ensure_access_token
self.access_token || generate_access_token
end
def generate_access_token
loop do
old_token = self.access_token
token = SecureRandom.urlsafe_base64(24).tr('lIO0', 'sxyz')
break token if (self.update!(access_token: token) rescue false) && old_token != token
end
end
def delete_access_token
self.update(access_token: nil)
end
def location= file
self.doc_type = file.original_filename.split('.').last
File.open(File.join(STORE_PATH, file.original_filename), "wb") { |f| f.write(file.read) }
self.location = File.join(STORE_DIR, file.original_filename)
end
end
####<app/controller/application_controller.rb>
class ApplicationController < ActionController::API
include ActionController::MimeResponds
before_action :authenticate_login
before_action :configure_permitted_parameters, if: :devise_controller?
rescue_from CanCan::AccessDenied do |exception|
respond_to do |format|
format.json { render json: {message: exception.message}, status: :unauthorized }
end
end
def authenticate_login user = User.find_by(name: params[:name]) if Devise.secure_compare(user.try(:access_token), params[:token]) sign_in user, store: false end end
protected
def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :grade, :birthday, :instrument]) end
end
####<aap/controller/user_controller.rb>
class UsersController < ApplicationController
skip_before_action :authenticate_user_from_token!, only: [:create]
def show render json: UserSerializer.new(current_user) end def current_user @current_user = current_user end def create @users = User.new user_params respond_to do |format| format.json { render json: @users, status: :creates, location: @users } else format.json {render json: @users.errors, status: :unprocessable_entity } end end end private def user_params params.require(:user).permit(:name, :password, :grade, :birthday, :instrument) end end end end
####<config/application.rb>
equire_relative 'boot'
require "rails"
// Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "action_cable/engine"
// require "sprockets/railtie"
require "rails/test_unit/railtie"
// Require the gems listed in Gemfile, including any gems
// you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)
module Api
class Application < Rails::Application
// Initialize configuration defaults for originally generated Rails version.
// Settings in config/environments/* take precedence over those specified here.
// Application configuration should go into files in config/initializers
// -- all .rb files in that directory are automatically loaded.
// Only loads a smaller set of middleware suitable for API only apps. // Middleware like session, flash, cookies can be added back manually. // Skip views, helpers and assets when generating a new resource. config.load_defaults 5.1 config.middleware.use Rack::Cors config.api_only = true config.to_prepare do DeviseController.respond_to :json end
end
end
####<config/initializers/cors.rb>
equire_relative 'boot'
require "rails"
// Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "action_cable/engine"
// require "sprockets/railtie"
require "rails/test_unit/railtie"
Bundler.require(*Rails.groups)
module OtonomoriApi
class Application < Rails::Application
config.load_defaults 5.1 config.middleware.use Rack::Cors config.api_only = true config.to_prepare do DeviseController.respond_to :json end
end
end
###補足情報(言語/FW/ツール等のバージョンなど)
Ruby on Rails 5.1.2 rails-api
あなたの回答
tips
プレビュー