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