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

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

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

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

0回答

986閲覧

railsで管理IDの実装方法について

koichi8888

総合スコア24

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2018/06/13 06:13

編集2018/06/13 06:16

前提・実現したいこと

railsの管理IDを下記の規則で生成し、実装する方法についての質問です。
別の質問(https://teratail.com/questions/130727)でIDを生成するSQL文に関しては把握できたのですが、これをコントローラ等にどうように記述するか分からず、質問しました。

管理IDを割り当てるタイミングについては下記の2パターンがあると思っております。

パターン1:
・既存で登録しているデータに対してIDをふり直す
※現状、適当に数値を割り当てています。

パターン2:
・新規登録する際に管理IDを割り当てる
⇒イメージとしては登録時のparamsのデータを参照し、管理IDを生成する。

参考になるサイト等、何かご存知でしたら、教えて頂けると幸いです。

命名規則
<category_id> + <created_atのyyyy/mm> + <各月ごとのシーケンス番号>

モデル名:GyomuDatum
|ID|manage_id|data|category_id|created_at
|:--|:--:|
|1|A201804_001|hoge|A|2018-04-01|
|1|A201804_002|hoge|A|2018-04-01|
|2|B201805_001|huga|B|2018-05-01|
|2|B201805_002|huga|B|2018-05-01|

該当のソースコード

items_controller.rb

Ruby

1class ItemsController < ApplicationController 2 3 before_action :authenticate_user 4 5 6 def index 7 8# データ検索 9 10pp "############データ検索開始############" 11 12 if params[:manage_id].present? 13 items = GyomuDatum.where('manage_id LIKE ?', "%#{params[:manage_id]}%") 14 elsif params[:category_id].present? 15 items = GyomuDatum.where('category_id LIKE ?', "%#{params[:category_id]}%") 16 elsif params[:publish_corporation].present? 17 items = GyomuDatum.where('publish_corporation LIKE ?', "%#{params[:publish_corporation]}%") 18 elsif params[:ip_address].present? 19 items = GyomuDatum.where('ip_address LIKE ?', "%#{params[:ip_address]}%") 20 elsif params[:target_server].present? 21 items = GyomuDatum.where('target_server LIKE ?', "%#{params[:target_server]}%") 22 elsif params[:start_date].present? 23 items = GyomuDatum.where('start_date LIKE ?', "%#{params[:start_date]}%") 24 elsif params[:end_date].present? 25 items = GyomuDatum.where('end_date LIKE ?', "%#{params[:end_date]}%") 26 elsif params[:comment].present? 27 items = GyomuDatum.where('comment LIKE ?', "%#{params[:comment]}%") 28 29 else 30 items = GyomuDatum.all.order(created_at: 'desc') 31 32 end 33 34 35 36 37pp "############データ検索終了############" 38 39 # ページネーション 40 @items = items.page(params[:page]).per(20) 41 42 # 期限が迫っているデータを検索する 43 44 # 1ヶ月前 45 from = Time.now.at_beginning_of_day 46 to = (from + 1.month) 47 @items_1month = GyomuDatum.where(end_date: from...to) 48 49 end 50 51 def show 52 end 53 54 def new 55 @item = GyomuDatum.new 56 end 57 58 def create 59 60 # 変数定義 61 62 @item = GyomuDatum.new(item_params) 63 manage_id = @item.manage_id 64 category_id = @item.category_id 65 66 67 # 現在の時刻取得 68 require "date" 69 time = DateTime.now 70 71 # 操作履歴登録 72 histories = HistoriesDatum.new({manage_id: manage_id, category_id: category_id, type_id: '1', user_id: session[:user_id], user_name: session[:user_name], created_at: time, updated_at: time, deleted_at: ""}) 73 histories.save 74 75 76 # データ登録判定 77 78 if @item.save 79 @notice_message = "データ登録成功" 80 flash[:notice] = @notice_message 81 redirect_to items_path 82 else 83 @notice_message = "データ登録失敗" 84 flash[:notice] = @notice_message 85 render 'new' 86 end 87 end 88 89 90 def edit 91 @item = GyomuDatum.find(params[:id]) 92 end 93 94 def update 95 96 # データ更新処理 97 98 # 変数定義 99 @item = GyomuDatum.find(params[:id]) 100 manage_id = @item.manage_id 101 category_id = @item.category_id 102 103 # 現在の時刻取得 104 require "date" 105 time = DateTime.now 106 107 # 操作履歴登録 108 histories = HistoriesDatum.new({manage_id: manage_id, category_id: category_id, type_id: '2', user_id: session[:user_id], user_name: session[:user_name], created_at: time, updated_at: time, deleted_at: ""}) 109 histories.save 110 111 # データ編集処理判定 112 if @item.update(item_params) 113 @notice_message = "データ編集成功" 114 flash[:notice] = @notice_message 115 redirect_to items_path 116 else 117 @notice_message = "データ編集失敗" 118 flash[:notice] = @notice_message 119 render 'edit' 120 end 121 end 122 123 def destroy 124 125 # データ削除処理 126 127 # 変数定義 128 @item = GyomuDatum.find(params[:id]) 129 manage_id = @item.manage_id 130 category_id = @item.category_id 131 132 # category_idの値を整数にする 133 if category_id == "SSL" 134 category_id = 1 135 elsif category_id == "ドメイン" 136 category_id = 2 137 end 138 139 # 現在の時刻取得 140 require "date" 141 time = DateTime.now 142 143 # 操作履歴登録 144 histories = HistoriesDatum.new({manage_id: manage_id, category_id: category_id, type_id: '3', user_id: session[:user_id], user_name: session[:user_name], created_at: time, updated_at: time, deleted_at: ""}) 145 histories.save 146 147 # 削除処理 148 @item = GyomuDatum.find(params[:id]) 149 @item.destroy 150 redirect_to items_path 151 end 152 153 154 # cron用メール送信メソッド 155 def mail_notice 156 157 # メール送信実行 158 SampleMailer.send_when_limit.deliver 159 160 end 161 162 # プライベートメソッド 163 private 164 def item_params 165 permits = [ 166 :manage_id, 167 :category_id, 168 :publish_corporation, 169 :ip_address, 170 :target_server, 171 :start_date, 172 :end_date, 173 :comment 174 ] 175 params.require(:gyomu_datum).permit(permits) 176 end 177 178# class範囲終了 179end

index.html.erb

html

1<main> 2<!-- ↓↓ログインメッセージ、データ登録、編集成功表示↓↓ --> 3 4 <% if flash[:notice] %> 5 <div class="alert alert-success"> 6 <%= flash[:notice] %> 7 </div> 8 <% end %> 9 10<!-- ↑↑ログインメッセージ、データ登録、編集成功表示↑↑ --> 11 12 13<br> 14<br> 15<br> 16<p class="rei1">通知</p> 17<br> 18<br> 19 20<% @items_1month.each do |item| %> 21 <ul> 22 <li> 23 管理ID <%= item.manage_id %> は期限切れまであとXX日です。有効期限の終了日は <%= item.end_date %> です。 24 </li> 25 </ul> 26<% end %> 27 28 29<br> 30<p class="rei1">データ検索</p> 31 32<div class="search_forms"> 33<br> 34<%= form_tag('/items', method: 'get') do %> 35 <%= label_tag(:manage_id, '管理ID') %> 36 <%= text_field_tag(:manage_id) %> 37 38<% if false %> 39 <%= label_tag(:category_id, 'カテゴリ') %> 40 <%= text_field_tag(:category_id) %> 41<% end %> 42 43 <%= label_tag(:category_id, 'カテゴリ') %> 44 <%= select_tag 'category_id', options_for_select(["1", "2"]) %> 45 46 47 <%= label_tag(:publish_corporation, '発行会社') %> 48 <%= text_field_tag(:publish_corporation) %> 49 50 <%= label_tag(:ip_address, 'IPアドレス') %> 51 <%= text_field_tag(:ip_address) %> 52<br> 53<br> 54 55 <%= label_tag(:target_server, '対象サーバ') %> 56 <%= text_field_tag(:target_server) %> 57 58 <%= label_tag(:start_date, '有効期限の開始日') %> 59 <%= text_field_tag(:start_date) %> 60 61 <%= label_tag(:end_date, '有効期限の終了日') %> 62 <%= text_field_tag(:end_date) %> 63<br> 64<br> 65 <%= label_tag(:comment, 'コメント') %> 66 <%= text_field_tag(:comment) %> 67 68 <%= submit_tag "検索", class: "form_button" %> <%= link_to 'クリア', items_path %> 69<% end %> 70</div> 71 72 73<br> 74<p class="rei1">データ一覧</p> 75<br> 76 77<!-- 権限によってデータ一覧の項目値を変更 --> 78 79<section> 80 81<!-- 追加箇所開始 --> 82<% if false %> 83<%= page_entries_info @items %> 84<% end %> 85<!-- 追加箇所終了 --> 86 87 88 <table class="type06"> 89 <thead> 90 91 <% if session[:authority] == "Admin" %> 92 93 <tr> 94 <th>管理ID</th> 95 <th>カテゴリ</th> 96 <th>発行会社</th> 97 <th>IPアドレス</th> 98 <th>対象サーバ</th> 99 <th>有効期限の開始日</th> 100 <th>有効期限の終了日</th> 101 <th>コメント</th> 102 <th>操作</th> 103 </tr> 104 105 </thead> 106 <tbody> 107 108 <% @items.each do |item| %> 109 <tr> 110 <td><%= item.manage_id %></td> 111 <td><%= item.category.name %></td> 112 <td><%= item.publish_corporation %></td> 113 <td><%= item.ip_address %></td> 114 <td><%= item.target_server %></td> 115 <td><%= item.start_date %></td> 116 <td><%= item.end_date %></td> 117 <td><%= item.comment %></td> 118 <td> 119 <%= link_to '[Edit]', edit_item_path(item), class: 'command' %> 120 <%= link_to '[Delete]', 121 item_path(item), 122 method: :delete, 123 class: 'command', 124 data: { confirm: 'データ削除しますか?' } %> 125 </td> 126 </tr> 127 128 <% end %> 129 130 131 <% elsif session[:authority] == "Operator" %> 132 133 <tr> 134 <th>管理ID</th> 135 <th>カテゴリ</th> 136 <th>発行会社</th> 137 <th>IPアドレス</th> 138 <th>対象サーバ</th> 139 <th>有効期限の開始日</th> 140 <th>有効期限の終了日</th> 141 <th>コメント</th> 142 </tr> 143 144 <% @items.each do |item| %> 145 <tr> 146 <td><%= item.manage_id %></td> 147 <td><%= item.category.name %></td> 148 <td><%= item.publish_corporation %></td> 149 <td><%= item.ip_address %></td> 150 <td><%= item.target_server %></td> 151 <td><%= item.start_date %></td> 152 <td><%= item.end_date %></td> 153 <td><%= item.comment %></td> 154 </tr> 155 156 <% end %> 157 158 <% else %> 159 160 <!-- データ一覧を表示しない --> 161 162 <% end %> 163 164 </tbody> 165 </table> 166 167 168<!-- 追加箇所開始 --> 169 170<%= paginate @items %> 171 172<!-- 追加箇所終了 --> 173 174</section> 175 176<br> 177<%= link_to "CSV出力", items_path(format: :csv), class: "btn btn-primary" %> 178 179 180 181<% if false %> 182 <% @items.each do |item| %> 183 <%= item.category.name %> 184 <% end %> 185<% end %> 186 187<% if false %> 188 189 <%= @items.each do |item| %> 190 <%= item.manage_id %> 191 192 <% item.category.each do |p| %> 193 <%= p.id %> 194 <%= p.name %> 195 <% end %> 196 197 <% end %> 198 199<% end %> 200 201 202</main> 203

試したこと

分かっていることはGyomuDatum.find_by_sqlという記述でコントローラ内でSQL文を実行できることです。

補足情報(FW/ツールのバージョンなど)

・Rails
Rails 4.2.10

・Mysql
mysql Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using EditLine wrapper

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問