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

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

新規登録して質問してみよう
ただいま回答率
85.51%
Ruby on Rails 5

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

Devise

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Q&A

1回答

969閲覧

RspecでPOST系のアクションが通らず、http422を返される

Beginnerrr

総合スコア17

Ruby on Rails 5

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

Devise

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

0グッド

1クリップ

投稿2019/03/14 02:43

編集2022/01/12 10:55

仕様

AdminアカウントがUserアカウントを管理するアプリケーションを作っています。
なので、User一覧(index)、User詳細(show)、ユーザー登録(new,create)、ユーザー編集(edit,update)、ユーザー削除(destory)。Adminでログインしている状態でしか、これらのアクションをできない様にする。

したい事

・deviseでAdminにログインした状態でしか、アクションを出来ない事を確かめるテストコードを書きたい。

現状

・GET系のアクションはテストコードが成功しているが、POST系のアクション(create, update, delete)はhttp422を返されエラー。
422について調べてみても全くわかりませんでした。

コード

まず、テストコードで「login」という自作メソッドを使っています。
ファイルパスは「spec/support/authentication_macros.rb」です。

RSpec

1module AuthenticationMacros 2 def login 3 let(:admin) {create(:admin)} 4 before do 5 sign_in admin 6 end 7 end 8end

以下の2行を「spec/rails_helper.rb」に書き足して、「login」という自作メソッドを読み込んでいます。

Rspec

1config.include Devise::Test::IntegrationHelpers, type: :request 2config.extend AuthenticationMacros

次に、テストコードです。

RSpec

1require 'rails_helper' 2RSpec.describe 'Pages', type: :request do 3 describe 'ログインした状態でアクションが成功するか' do 4 login 5 describe 'GET系は成功する' do 6 let(:user) { create(:user) } 7 example 'index, show, new, edit' do 8 get '/' 9 get '/users/3' # /users/:idだとエラーが起きるので、idを直接指定指定ます。 10 get '/users/3/edit' 11 get '/users/new' 12 expect(response).to have_http_status(:success) 13 end 14 end 15 describe 'なぜかPOST系は失敗する。422を返される' do 16 example 'create' do 17 post '/users/3/create' 18 expect(response).to have_http_status(:success) 19 end 20 example 'update' do 21 patch '/users/3' 22 expect(response).to have_http_status(:success) 23 end 24 example 'delete' do 25 delete '/users/3' 26 expect(response).to have_http_status(:success) 27 end 28 end 29 end 30end 31

なぜこの様な結果になるのか皆目見当もつきません。
422番が何を指すかもさっぱり分かりません(勿論、色々調べてはいます)
2日間もこれに悩まされています。
どなたか知恵をお貸しください。。。

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

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

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

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

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

guest

回答1

0

post時のパラメーターを設定しないとparams.requireの部分でエラーがでます。

params.permit(:user).permit(:name, :text)
ならば

rb

1post '/users/3/create', params: {user: {name: 'hoge', text: 'foobar'}}

permitで渡したキーをもつHashをparamsにわたす必要があります。


ところで、'/users/3/edit'にアクセスできているのならば'/users/3/create'は失敗する気がします。

投稿2019/03/16 06:18

asm

総合スコア15147

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問