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

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

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

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

Q&A

解決済

2回答

642閲覧

Railsのアソシエーションでの値の取り出し方

koichi8888

総合スコア24

Ruby on Rails 4

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

0グッド

0クリップ

投稿2018/06/08 05:51

編集2018/06/11 03:04

前提・実現したいこと

railsで参照先のカラムの値を取得し、viewに表示したいです。
具体的にはcategory_idから対応するcategoryモデルのnameカラムの値を取得し、viewに表示したいです。
おそらく、index.html.erbのcategory_idの記載をcategoryモデルから取得するように修正する必要があるのですが、
色々試してみたのですが、記載方法が分からないため、教えて頂けますでしょうか。

試行錯誤する中で↓のエラーメッセージが表示されている、また、category_idに1または2しか登録できないことから、アソシエーションの設定には成功していると思います。

試した記載:
<%= @items.each do |item| %>
<%= item.manage_id %>

<% item.category.each do |p| %> <%= p.name %> <% end %>

<% end %>

エラーメッセージ:
undefined method `each' for #<Category id: 1, name: "SSL">

モデル名:GyomuDatum
|ID|category_id※外部キー|..|..|
|:--|:--:||:--:|
|1|1|
|2|2|

モデル名:Category

ID※主キーname
1A
2B

モデル名:HistoriesDatum

|Operation_id|namage_id|user_id|user_name|created_at
|:--|:--:|
|1|10001|7|tanaka|yyyy/mm/dd/hh:mm
|2|10002|8|sato|yyyy/mm/dd/hh:mm

該当のソースコード

gyomu_datum.rb

Ruby

1class GyomuDatum < ActiveRecord::Base 2 3belongs_to :Category 4 5end 6

category.rb

Ruby

1class Category < ActiveRecord::Base 2 3has_many :GyomuData 4 5end

views/items/index.html.erb

Ruby

1 2<p class="rei1">データ一覧</p> 3<br> 4 5<!-- 権限によってデータ一覧の項目値を変更 --> 6 7<section> 8 9 <table class="type06"> 10 <thead> 11 12 <% if session[:authority] == "1" %> 13 14 <tr> 15 <th>管理ID</th> 16 <th>カテゴリ</th> 17 <th>発行会社</th> 18 <th>IPアドレス</th> 19 <th>対象サーバ</th> 20 <th>有効期限の開始日</th> 21 <th>有効期限の終了日</th> 22 <th>コメント</th> 23 <th>操作</th> 24 </tr> 25 26 </thead> 27 <tbody> 28 29 <% @items.each do |item| %> 30 <tr> 31 <td><%= item.manage_id %></td> 32 <td><%= item.category_id %></td> 33 <td><%= item.publish_corporation %></td> 34 <td><%= item.ip_address %></td> 35 <td><%= item.target_server %></td> 36 <td><%= item.start_date %></td> 37 <td><%= item.end_date %></td> 38 <td><%= item.comment %></td> 39 <td> 40 <%= link_to '[Edit]', edit_item_path(item), class: 'command' %> 41 <%= link_to '[Delete]', 42 item_path(item), 43 method: :delete, 44 class: 'command', 45 data: { confirm: 'データ削除しますか?' } %> 46 </td> 47 </tr> 48 49 <% end %> 50 51 52 <% elsif session[:authority] == "2" %> 53 54 <tr> 55 <th>管理ID</th> 56 <th>カテゴリ</th> 57 <th>発行会社</th> 58 <th>IPアドレス</th> 59 <th>対象サーバ</th> 60 <th>有効期限の開始日</th> 61 <th>有効期限の終了日</th> 62 <th>コメント</th> 63 </tr> 64 65 <% @items.each do |item| %> 66 <tr> 67 <td><%= item.manage_id %></td> 68 <td><%= item.category_id %></td> 69 <td><%= item.publish_corporation %></td> 70 <td><%= item.ip_address %></td> 71 <td><%= item.target_server %></td> 72 <td><%= item.start_date %></td> 73 <td><%= item.end_date %></td> 74 <td><%= item.comment %></td> 75 </tr> 76 77 <% end %> 78 79 <% else %> 80 81 <!-- データ一覧を表示しない --> 82 83 <% end %> 84 85 </tbody> 86 </table> 87 88</section> 89

item_controller.rb

Ruby

1class ItemsController < ApplicationController 2 3 before_action :authenticate_user 4 5 6 def index 7 8 # データを降順で表示する 9 # @items = GyomuDatum.all.order(created_at: 'desc') 10 11 @items = GyomuDatum.all.includes(:category) 12 13 # データ検索 14 15pp "############データ検索開始############" 16 17 if params[:manage_id].present? 18 items = GyomuDatum.where('manage_id LIKE ?', "%#{params[:manage_id]}%") 19 pp "manage_id_debug" 20 pp items 21 elsif params[:category_id].present? 22 items = GyomuDatum.where('category_id LIKE ?', "%#{params[:category_id]}%") 23 pp "category_id_debug" 24 pp items 25 elsif params[:publish_corporation].present? 26 items = GyomuDatum.where('publish_corporation LIKE ?', "%#{params[:publish_corporation]}%") 27 pp "publish_corporation_debug" 28 pp items 29 pp items 30 elsif params[:ip_address].present? 31 items = GyomuDatum.where('ip_address LIKE ?', "%#{params[:ip_address]}%") 32 pp "ip_address_debug" 33 pp items 34 elsif params[:target_server].present? 35 items = GyomuDatum.where('target_server LIKE ?', "%#{params[:target_server]}%") 36 pp "target_server_debug" 37 pp items 38 elsif params[:start_date].present? 39 items = GyomuDatum.where('start_date LIKE ?', "%#{params[:start_date]}%") 40 pp "start_date_debug" 41 pp items 42 elsif params[:end_date].present? 43 items = GyomuDatum.where('end_date LIKE ?', "%#{params[:end_date]}%") 44 pp "end_date_debug" 45 pp items 46 elsif params[:comment].present? 47 items = GyomuDatum.where('comment LIKE ?', "%#{params[:comment]}%") 48 pp "comment_debug" 49 pp items 50 else 51 items = GyomuDatum.all.order(created_at: 'desc') 52 pp "all_debug" 53 pp items 54 end 55 56 pp "elseout" 57 pp items 58 59pp "############データ検索終了############" 60 61 62 63 # ページネーション 64 @items = items.page(params[:page]).per(20) 65 66 # 期限が迫っているデータを検索する 67 68 # 1ヶ月前 69 from = Time.now.at_beginning_of_day 70 to = (from + 1.month) 71 @items_1month = GyomuDatum.where(end_date: from...to) 72 73 end 74 75 def show 76 end 77 78 def new 79 @item = GyomuDatum.new 80 end 81 82 def create 83 84 # 変数定義 85 manage_id = params[:manage_id] 86 87 @item = GyomuDatum.find(params[:id]) 88 manage_id = @item.manage_id 89 category_id = @item.category_id 90 91 # 現在の時刻取得 92 require "date" 93 time = DateTime.now 94 95 # 操作履歴登録 96 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: ""}) 97 histories.save 98 99 100 # render plain: params[:GyomuDatum].inspect 101 # save 102 # @item = Item.new(params[:GyomuDatum]) 103 # @item = GyomuDatum.new(params.require(:GyomuDatum).permit(:manage_id, :category_id, :publish_corporation, :ip_address, :target_server, :start_date, :end_date, :comment)) 104 @item = GyomuDatum.new(item_params) 105 # @item.save 106 # redirect 107 # redirect_to items_path 108 109 110 # データ登録判定 111 112 if @item.save 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 plain: @item.errors.inspect 120 render 'new' 121 end 122 end 123 124 125 def edit 126 @item = GyomuDatum.find(params[:id]) 127 end 128 129 def update 130 131 # データ更新処理 132 133 # 変数定義 134 @item = GyomuDatum.find(params[:id]) 135 manage_id = @item.manage_id 136 category_id = @item.category_id 137 138 # 現在の時刻取得 139 require "date" 140 time = DateTime.now 141 142 # 操作履歴登録 143 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: ""}) 144 histories.save 145 146 147 # データ編集処理判定 148 149 if @item.update(item_params) 150 @notice_message = "データ編集成功" 151 flash[:notice] = @notice_message 152 redirect_to items_path 153 else 154 @notice_message = "データ編集失敗" 155 flash[:notice] = @notice_message 156 render 'edit' 157 end 158 end 159 160 def destroy 161 162 # データ削除処理 163 164 # 変数定義 165 @item = GyomuDatum.find(params[:id]) 166 manage_id = @item.manage_id 167 category_id = @item.category_id 168 169 # 現在の時刻取得 170 require "date" 171 time = DateTime.now 172 173 # 操作履歴登録 174 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: ""}) 175 histories.save 176 177 # 削除処理 178 @item = GyomuDatum.find(params[:id]) 179 @item.destroy 180 redirect_to items_path 181 end 182 183 184 185 # cron用メール送信メソッド 186 def mail_notice 187 188 # メール送信実行 189 SampleMailer.send_when_limit.deliver 190 191 end 192 193 194 # プライベートメソッド 195 196# private 197# def item_params 198# params.require(:GyomuDatum).permit(:manage_id) 199# params.require(:gyomu_datum).permit(:manage_id, :category_id, :publish_corporation, :ip_address, :target_server, :start_date, :end_date, :comment) 200# params.require.fetch(:GyomuDatum,{}).permit(:manage_id, :category_id, :publish_corporation, :ip_address, :target_server, :start_date, :end_date, :comment) 201# end 202 203 # プライベートメソッド 204 private 205 def item_params 206 permits = [ 207 :manage_id, 208 :category_id, 209 :publish_corporation, 210 :ip_address, 211 :target_server, 212 :start_date, 213 :end_date, 214 :comment 215 ] 216 params.require(:gyomu_datum).permit(permits) 217 end 218 219# class範囲終了 220end 221

edit.html.erb

Ruby

1<!-- ↓↓データ編集失敗表示↓↓ --> 2 3 <% if flash[:notice] %> 4 <div class="alert alert-success"> 5 <%= flash[:notice] %> 6 </div> 7 <% end %> 8 9<!-- ↑↑データ編集失敗表示↑↑ --> 10 11<br> 12<br> 13<br> 14<h2> 15<%= form_for @item, url: item_path(@item) do |f| %> 16<p class="rei1">データ編集</p> 17<p> 18 管理ID: 19 <br> 20 <%= f.text_field :manage_id, placeholder: '管理ID' %> 21</p> 22<p> 23 カテゴリ: 24 <br> 25<% if false %> 26 <%= f.select :category_id, [["SSL", "1"], ["ドメイン", "2"] ] %> 27<% end %> 28 29 <%= f.text_field :category_id, placeholder: 'カテゴリ' %> 30 31</p> 32<p> 33 発行会社: 34 <br> 35 <%= f.text_field :publish_corporation, placeholder: '発行会社' %> 36</p> 37<p> 38 IPアドレス: 39 <br> 40 <%= f.text_field :ip_address, placeholder: 'IPアドレス' %> 41</p> 42<p> 43 サーバ名: 44 <br> 45 <%= f.text_field :target_server, placeholder: 'サーバ名' %> 46</p> 47<p> 48 有効期限の開始: 49 <br> 50 <%= f.text_field :start_date, placeholder: '2018-04-01' %> 51</p> 52<p> 53 有効期限の終了: 54 <br> 55 <%= f.text_field :end_date, placeholder: '2018-04-01' %> 56</p> 57<p> 58 コメント: 59 <br> 60 <%= f.text_area :comment, placeholder: 'コメント' %> 61</p> 62<p> 63<br> 64 <%= f.submit "編集完了" , class: "btn btn-primary"%> 65</p> 66 67 68<% end %>

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

・Apache
Server version: Apache/2.4.6 (CentOS)

・Rails
Rails 4.2.10

・OSバージョン
$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

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

・Ruby
ruby 2.3.7p456 (2018-03-28 revision 63024) [x86_64-linux]

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

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

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

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

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

guest

回答2

0

エラー見る限り、★をつけたとこでエラーになってるのかなと思います。

def create # 変数定義 manage_id = params[:manage_id] @item = GyomuDatum.find(params[:id]) manage_id = @item.manage_id category_id = @item.category_id # 現在の時刻取得 require "date" time = DateTime.now # 操作履歴登録 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: ""}) histories.save ★

category_idに明示的に1または2を登録する処理をコントローラに記載してもエラーになります。

これは、★をつけた行の上の行を、以下のように変えたということ?

category_id: category_id ↓ category_id: 1

投稿2018/06/11 05:04

dobby618

総合スコア302

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

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

0

ベストアンサー

controllerの実装も教えてもらえますか?

見てる感じだと、以下のような感じですか?

@items = GyomuDatum.all or @items = GyomuDatum.where(・・・

もしそうだとすれば
GyomuDatumから見たCategoryは一つしか結びつかないので
(DB上も一つのGyomuDatumに対して、category_idは一つしか格納できませんよね?)

item.category.name
で取得できると思います。

投稿2018/06/08 11:58

編集2018/06/08 12:00
dobby618

総合スコア302

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

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

koichi8888

2018/06/11 02:58

ご回答有難うございます。教えて頂いた通り、item.category.nameでcategoryモデルからデータを取得することができました。 はまっていたので、大変助かりました。 テーブル間の連携はできたのですが、データ登録/編集/削除処理の各メソッドで操作履歴をテーブルに記録する処理があるのですが、↓のエラーが表示されるようになりました。 ##ここから## ActiveRecord::InvalidForeignKey in ItemsController#update Mysql2::Error: Cannot add or update a child row: a foreign key constraint fails (`Myapp_development`.`histories_data`, CONSTRAINT `fk_rails_738067d333` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`)): INSERT INTO `histories_data` (`manage_id`, `category_id`, `type_id`, `user_id`, `user_name`, `created_at`, `updated_at`) VALUES ('1', 0, 2, 7, 'oshima001', '2018-06-11 11:22:18', '2018-06-11 11:22:18') ##ここまで## 外部キーのカラムのデータを登録する際はcategoryモデルのIDに存在する整数を登録する(※あくまで表示のみcategoryモデルのnameカラムから取得したデータを表示している認識のため)と思っているのですが、category_idに明示的に1または2を登録する処理をコントローラに記載してもエラーになります。edit.html.erbとitems_controller.rb、操作履歴のテーブル情報を追記するので、何かご存知であれば、教えて頂ければ、幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問