CRUD を作成⑦
CRUD を作成⑥ の続き。今回はデータを新しく作成できるようにする。
app/controllers/books_controller.rb に以下のコードを追加する。
def new
@book = Book.new
end
テストを実行する。
bundle e rspec spec/requests/books_spec.rb
グリーンになる。追加した変更は既存のコードに何も影響を与えていないことがわかる。
app/views/books/new.html.erb を以下のように修正する。
<%= form_with model: @book do |form| %>
<%= form.text_field :title %>
<%= form.submit '作成' %>
<% end %>
テストを実行する。
bundle e rspec spec/requests/books_spec.rb
グリーンになる。ビューに追加したコードも問題ないことがわかる。
表示を確認する。
現状ではインプットフィールドに何かしらの値を入力して作成ボタンを押しても何も起きない。なぜならデータを保存するコードを書いていないからだ。そのため、データを保存する処理を追加する。
app/controllers/books_controller.rb に以下のコードを追加する。
def create
@book = Book.new
end
これではフォームから送ったデータを保存することができない。
ストロングパラメータを追加する。
def book_params
params.require(:book).permit(:title)
end
そしてこれを使用するようにcreateアクションを修正する。
def create
@book = Book.new(book_params)
end
そして保存の処理を行うメソッドを呼び出すように修正する。
def create
@book = Book.new(book_params)
@book.save
end
コードを変更したのでテストを実行する。
bundle e rspec spec/requests/books_spec.rb
レッドになる。
...F...
Failures:
1) Books POST /books 正常系 204 を返す
Failure/Error: params.require(:book).permit(:title)
ActionController::ParameterMissing:
param is missing or the value is empty: book
# ./app/controllers/books_controller.rb:31:in `book_params'
# ./app/controllers/books_controller.rb:15:in `create'
# /usr/local/bundle/gems/actiontext-7.0.4.1/lib/action_text/rendering.rb:20:in `with_renderer'
# /usr/local/bundle/gems/actiontext-7.0.4.1/lib/action_text/engine.rb:69:in `block (4 levels) in <class:Engine>'
# /usr/local/bundle/gems/warden-1.2.9/lib/warden/manager.rb:36:in `block in call'
# /usr/local/bundle/gems/warden-1.2.9/lib/warden/manager.rb:34:in `catch'
# /usr/local/bundle/gems/warden-1.2.9/lib/warden/manager.rb:34:in `call'
# /usr/local/bundle/gems/rack-2.2.6.2/lib/rack/tempfile_reaper.rb:15:in `call'
# /usr/local/bundle/gems/rack-2.2.6.2/lib/rack/etag.rb:27:in `call'
# /usr/local/bundle/gems/rack-2.2.6.2/lib/rack/conditional_get.rb:40:in `call'
# /usr/local/bundle/gems/rack-2.2.6.2/lib/rack/head.rb:12:in `call'
# /usr/local/bundle/gems/rack-2.2.6.2/lib/rack/session/abstract/id.rb:266:in `context'
# /usr/local/bundle/gems/rack-2.2.6.2/lib/rack/session/abstract/id.rb:260:in `call'
# /usr/local/bundle/gems/railties-7.0.4.1/lib/rails/rack/logger.rb:40:in `call_app'
# /usr/local/bundle/gems/railties-7.0.4.1/lib/rails/rack/logger.rb:25:in `block in call'
# /usr/local/bundle/gems/railties-7.0.4.1/lib/rails/rack/logger.rb:25:in `call'
# /usr/local/bundle/gems/rack-2.2.6.2/lib/rack/method_override.rb:24:in `call'
# /usr/local/bundle/gems/rack-2.2.6.2/lib/rack/runtime.rb:22:in `call'
# /usr/local/bundle/gems/rack-2.2.6.2/lib/rack/sendfile.rb:110:in `call'
# /usr/local/bundle/gems/railties-7.0.4.1/lib/rails/engine.rb:530:in `call'
# /usr/local/bundle/gems/rack-test-2.0.2/lib/rack/test.rb:358:in `process_request'
# /usr/local/bundle/gems/rack-test-2.0.2/lib/rack/test.rb:155:in `request'
# ./spec/requests/books_spec.rb:38:in `block (4 levels) in <main>'
Finished in 0.37106 seconds (files took 2.9 seconds to load)
7 examples, 1 failure
Failed examples:
rspec ./spec/requests/books_spec.rb:36 # Books POST /books 正常系 204 を返す
保存の処理を行う際にパラメータが必須なため、パラメータを送るようにテストを修正する。
describe "POST /books" do
let(:params) { { book: { title: } } }
let(:title) { 'test' }
context '正常系' do
it '204 を返す' do
post "/books", params: params
expect(response).to have_http_status(:no_content)
end
end
end
テストを実行する。すべてグリーンになる。
.......
Finished in 0.29885 seconds (files took 2.06 seconds to load)
7 examples, 0 failures
次に続く。
この記事が気に入ったらサポートをしてみませんか?