LoginSignup
13
10

More than 3 years have passed since last update.

Railsのindexページで、一つのフォームでcreateもupdateもする

Last updated at Posted at 2019-05-27

はじめまして。
私はRuby on Railsを使ったシステム開発に携わらせていただいています。

今回、私は先輩から課題のようなものを出されました。
その課題というのは、

  • id、group_no,group_nameというカラムを持ったtestsテーブルを作成しろ(group_noにはインデックス付与し、一意になるように。)
  • TestモデルのCRUD操作を実装しろ
  • ただし、CRUD操作はindexページだけで行えるようにしろ。また、新規投稿のためのフォームと、情報更新のためのフォームは一つとする。

というものでした。
要はrailsの標準機能で作成されるうな、index,new,editなどのページに遷移することなく、indexページで情報の一覧表示、作成、更新、削除を行えるようにしろということでした。

1番目のテーブル周りの課題はグーグルで調べながら実装したので、何とか無事に終えることができました。

しかし2番目と3番目の課題、特に一つのフォームでcreateもupdateもするという実装をしたことがなかったので、何とか調べながら実装しました。

取った方法は以下のとおりです。

view

index.rb
#デザイン部分は全く考慮していません

<%= form_for @test, url: test_index_path do |f| %>
   #group_noカラムのフィールド
   <%= f.label :group_no,'管理番号' %>
   <%= f.text_field :group_no %>
   #group_nameのフィールド
   <%= f.label :group_name,'所属グループ名称' %>
   <%= f.text_field :group_name %>
   #createもしくはupdateを行う
   <%= f.submit "保存"  %>
<% end %>

コントローラー

tests_cotoroller.rb

def create
#group_noは一意の番号。既にその番号が使われているのであれば、データの更新。そうで無ければ、データの作成。(test_paramsはストロングパラメーター)
    @test = Test.find_or_initialize_by(group_no: test_params[:group_no])
    #新しいレコードの場合createのアクションを行う。
    if @test.new_record?
      @test = Test.new(test_params)
      @test.save!
    #そうでなければ、送られてきたパラメーターの値に更新
    else
      @test.update(test_params)
    end
  end

とすることで、同一のフォームで、createもupdateも行えるようになりました。
私としては、
業務システムなんかでよく使うマスタメンテ画面などは、一つのページで新規作成、編集、削除、一覧表示などが求められるので、そのような場面で利用するイメージです。

13
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10