teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

10

現状の追加

2021/03/17 09:04

投稿

motoki6318
motoki6318

スコア2

title CHANGED
File without changes
body CHANGED
@@ -277,5 +277,36 @@
277
277
 
278
278
  end
279
279
  ```
280
+
281
+ ### 試したこと2
282
+
283
+ save処理後すぐに保存された最新のレコードを取り出す
284
+ ```
285
+ def create
286
+ @camp = CampTags.new(camp_params)
287
+
288
+ if @camp.valid?
289
+ @tag_list = camp_params[:style].split(/[[:blank:]]+/).select(&:present?)
280
- データはどうやったら取り出せるのでしょうか
290
+ @camp.save(@tag_list)
291
+ camp = Camp.order(updated_at: :desc).limit(1)
292
+ @camp_id = camp.ids
293
+ @item_ids = @camp.item_ids
294
+ binding.pry
295
+ @item_ids.each do |item_id|
296
+ CampItemRelation.create(camp_id: @camp_id, item_id: item_id)
297
+ end
298
+ return redirect_to root_path
299
+ else
300
+ render "new"
301
+ end
302
+ end
303
+ ```
304
+
305
+ ```camp = Camp.order(updated_at: :desc).limit(1)```
306
+ とすることで最新のレコードを一個取り出しています。
307
+
308
+ ![イメージ説明](26a932b5800a9588787aa508344d1bda.png)
309
+
310
+
311
+ 答えはおそらくもうすぐそこです!
281
312
  どうかご教授ください!

9

@campを調べた記述を追加

2021/03/17 09:03

投稿

motoki6318
motoki6318

スコア2

title CHANGED
File without changes
body CHANGED
@@ -28,6 +28,13 @@
28
28
  - @campを取り出せれば解決する
29
29
  - @campを指定すると:camp_tagsからidを取り出そうとするため@camp.idが無いとエラーになる
30
30
 
31
+ @campを確認するとidは保存されているようです。
32
+ ```
33
+ >> @camp
34
+ => #<CampTags:0x00007ff6085ac980 @errors=#<ActiveModel::Errors:0x00007ff6085ac250 @base=#<CampTags:0x00007ff6085ac980 ...>, @messages={}, @details={}>, @title="bboobb", @style="無骨キャンプ", @item_ids=["1", "2"], @user_id=1, @validation_context=nil, @camp=#<Camp id: 36, user_id: 1, title: "bboobb", created_at: "2021-03-17 06:28:53", updated_at: "2021-03-17 06:28:53">, @tag_id=#<Tag id: 4, style: "無骨キャンプ", created_at: "2021-03-16 09:04:46", updated_at: "2021-03-16 09:04:46">>
35
+ >>
36
+ ```
37
+
31
38
  ### 該当するコード
32
39
 
33
40
  コントローラー

8

error文のテキスト表示

2021/03/17 06:42

投稿

motoki6318
motoki6318

スコア2

title CHANGED
File without changes
body CHANGED
@@ -7,7 +7,16 @@
7
7
  - キャンプ記録を作成する際持って行ったアイテムの登録を実現させたい
8
8
  ### エラー内容
9
9
  ![イメージ説明](27999a5e0ddef3f502a81501658bcc31.png)
10
+ ```
11
+ undefined method `id' for #<CampTags:0x00007ff6085ac980>
12
+ Request
13
+ Parameters:
10
14
 
15
+ {"authenticity_token"=>"6h75fWC/+zhPx96ZoRyir+kyevpfqLqawP75tlOKrGHOXHlfKtMlG0qvpQMLgrjc5Ld3x1bvduvrtllnJPZagw==",
16
+ "camp_tags"=>{"title"=>"bboobb", "style"=>"無骨キャンプ", "item_ids"=>["1", "2"]},
17
+ "commit"=>"Send"}
18
+ ```
19
+
11
20
  - @camp.idを取り出したいがidがないと出る
12
21
 
13
22
  ### 状況

7

アプリの仕様を記述

2021/03/17 06:31

投稿

motoki6318
motoki6318

スコア2

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,10 @@
1
+ ### アプリの仕様
2
+ - キャンプの記録をするアプリです
3
+ - ユーザーはキャンプのタイトルとキャンプスタイルという名のタグをつけて投稿します。
4
+ - キャンプタイトルとタグを同時に保存するためにフォームオブジェクトを使用しています。
5
+ - ユーザーは自分の持っているアイテムを登録できます。
6
+ - キャンプには複数のアイテムを持っていける。アイテムは何度でもキャンプに持っていけることからキャンプとアイテムは多対多の関係です。
7
+ - キャンプ記録を作成する際持って行ったアイテムの登録を実現させたい
1
8
  ### エラー内容
2
9
  ![イメージ説明](27999a5e0ddef3f502a81501658bcc31.png)
3
10
 

6

試したこと追加

2021/03/17 06:19

投稿

motoki6318
motoki6318

スコア2

title CHANGED
File without changes
body CHANGED
@@ -173,4 +173,86 @@
173
173
  belongs_to :item
174
174
  end
175
175
  ```
176
+
177
+ ### 試したこと
178
+
179
+ コントローラーではitem_idsを扱える
180
+ フォームオブジェクトではcamp.idを扱えることから
181
+ CampItemRelation.createでのcampとitemのidの保存を別々で行ってみた。
182
+ 最初にフォームオブジェクトで```CampItemRelation.create(camp_id: @camp.id)```として
183
+ 次にコントローラーで```CampItemRelation.create(item_id: item_id)```
184
+ こうすることでデータを扱えるうちに保存できると考えましたが、データはどうやら同時に保存しないといけないらしくこれらの記述は読み飛ばされたようでした。
185
+ ```controller
186
+ class CampsController < ApplicationController
187
+ before_action :authenticate_user!, except: [:index, :show]
188
+ before_action :set_item, only: [:index, :new, :show, :create]
189
+ def index
190
+ @tags = Tag.all
191
+ end
192
+
193
+ def new
194
+ @camp = CampTags.new
195
+ end
196
+
197
+ def create
198
+ @camp = CampTags.new(camp_params)
199
+
200
+ if @camp.valid?
201
+ @tag_list = camp_params[:style].split(/[[:blank:]]+/).select(&:present?)
202
+ @camp.save(@tag_list)
203
+
204
+ @item_ids = @camp.item_ids
205
+ @item_ids.each do |item_id|
206
+ CampItemRelation.create(item_id: item_id)
207
+ end
208
+ return redirect_to root_path
209
+ else
210
+ render "new"
211
+ end
212
+ end
213
+
214
+ private
215
+
216
+ def camp_params
217
+ params.require(:camp_tags).permit(:title, :style, item_ids: []).merge(user_id: current_user.id)
218
+ end
219
+
220
+ def set_item
221
+ if user_signed_in?
222
+ user = User.find(current_user.id)
223
+ @items = user.items
224
+ end
225
+ end
226
+
227
+ end
228
+ ```
229
+
230
+ ```fromobject
231
+ class CampTags
232
+
233
+ include ActiveModel::Model
234
+ attr_accessor :title, :style, :user_id, :item_ids
235
+
236
+ with_options presence: true do
237
+ validates :title
238
+ validates :style
239
+ end
240
+
241
+ def save(tag_list)
242
+ @camp = Camp.create(user_id: user_id, title: title)
243
+ CampItemRelation.create(camp_id: @camp.id)
244
+ tag_list.each do |tag|
245
+ unless Tag.find_by(style: tag)
246
+ @tag = Tag.create(style: tag)
247
+ CampTagRelation.create(camp_id: @camp.id, tag_id: @tag.id)
248
+ else
249
+ @tag_id = Tag.find_by(style: tag)
250
+ CampTagRelation.create(camp_id: @camp.id, tag_id: @tag_id.id)
251
+ end
252
+ end
253
+ end
254
+
255
+ end
256
+ ```
257
+ データはどうやったら取り出せるのでしょうか
176
258
  どうかご教授ください!

5

現状の追加

2021/03/17 04:09

投稿

motoki6318
motoki6318

スコア2

title CHANGED
File without changes
body CHANGED
@@ -10,6 +10,7 @@
10
10
  - campとtagの情報については登録保存は成功している
11
11
  - @camp_id = 3と直球にidを指定してやるとitemとcampの関連付けはできた
12
12
  - @campを取り出せれば解決する
13
+ - @campを指定すると:camp_tagsからidを取り出そうとするため@camp.idが無いとエラーになる
13
14
 
14
15
  ### 該当するコード
15
16
 

4

タイトル変更

2021/03/17 03:03

投稿

motoki6318
motoki6318

スコア2

title CHANGED
@@ -1,1 +1,1 @@
1
- undefined method `id'  idを取り出した
1
+ undefined method `id'  idはどこへ行ってまっのか
body CHANGED
File without changes

3

現状の追加

2021/03/17 02:59

投稿

motoki6318
motoki6318

スコア2

title CHANGED
File without changes
body CHANGED
@@ -8,6 +8,8 @@
8
8
  - campのデータについてはtagと同時に作成されるためFormオブジェクトで保存
9
9
  - itemに関しては保存してあったものをselectによって選択する
10
10
  - campとtagの情報については登録保存は成功している
11
+ - @camp_id = 3と直球にidを指定してやるとitemとcampの関連付けはできた
12
+ - @campを取り出せれば解決する
11
13
 
12
14
  ### 該当するコード
13
15
 

2

ルーティングを追加

2021/03/17 00:31

投稿

motoki6318
motoki6318

スコア2

title CHANGED
File without changes
body CHANGED
@@ -118,6 +118,17 @@
118
118
  </div>
119
119
  ```
120
120
 
121
+ ### ルーティング
122
+
123
+ ```
124
+ Rails.application.routes.draw do
125
+ root to: "camps#index"
126
+ resources :camps, only: [:new, :create, :show]
127
+ resources :items, only: [:new, :create, :show]
128
+ devise_for :users
129
+ end
130
+ ```
131
+
121
132
  ### テーブル同士のアソシエーション
122
133
 
123
134
  ```itemmodel

1

入力欄のコードを追加

2021/03/16 10:53

投稿

motoki6318
motoki6318

スコア2

title CHANGED
File without changes
body CHANGED
@@ -85,6 +85,39 @@
85
85
  end
86
86
  ```
87
87
 
88
+ 入力フォーム
89
+ ```newhtmlerb
90
+ <div class="wrapper">
91
+ <div class="side-ber">
92
+ <%= render "side_ber" %>
93
+ </div>
94
+ <%= form_with model: @camp, url: camps_path, class:'form-wrap', local: true do |f| %>
95
+ <div class='form'>
96
+ <div class="title-field">
97
+ <%= f.label :title, "キャンプタイトル" %>
98
+ <%= f.text_area :title, class:"input-title" %>
99
+ </div>
100
+ <div class="tag-field", id='tag-field'>
101
+ <%= f.label :style, "キャンプスタイル" %>
102
+ <%= f.text_field :style, class:"input-tag" %>
103
+ </div>
104
+
105
+ <p>使用アイテムを選択 </p>
106
+ <select name="camp_tags[item_ids][]" multiple>
107
+ <% @items.each do |item| %>
108
+ <option value=<%= item.id %>><%= item.name %></option>
109
+ <% end %>
110
+ </select>
111
+
112
+
113
+ </div>
114
+ <div class="submit-post">
115
+ <%= f.submit "Send", class: "submit-btn" %>
116
+ </div>
117
+ <% end %>
118
+ </div>
119
+ ```
120
+
88
121
  ### テーブル同士のアソシエーション
89
122
 
90
123
  ```itemmodel