見出し画像

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

次に続く。


この記事が気に入ったらサポートをしてみませんか?