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

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

ただいまの
回答率

90.37%

  • Ruby on Rails

    9355questions

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

  • API

    1893questions

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

  • JSON

    1528questions

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

  • Devise

    324questions

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

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

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 523

icchie

score 17

前提・実現したいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

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

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

  • ただいまの回答率 90.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby on Rails

    9355questions

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

  • API

    1893questions

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

  • JSON

    1528questions

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

  • Devise

    324questions

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