質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

518閲覧

RailsAPIでクライアントから送られてきたリクエストをデコードし、許可したい。

icchie

総合スコア21

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2017/08/27 08:48

###前提・実現したいこと
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問