質問編集履歴
10
現状の追加
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
|
+

|
309
|
+
|
310
|
+
|
311
|
+
答えはおそらくもうすぐそこです!
|
281
312
|
どうかご教授ください!
|
9
@campを調べた記述を追加
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文のテキスト表示
title
CHANGED
File without changes
|
body
CHANGED
@@ -7,7 +7,16 @@
|
|
7
7
|
- キャンプ記録を作成する際持って行ったアイテムの登録を実現させたい
|
8
8
|
### エラー内容
|
9
9
|

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

|
3
10
|
|
6
試したこと追加
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
現状の追加
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
タイトル変更
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
undefined method `id' id
|
1
|
+
undefined method `id' idはどこへ行ってしまったのか
|
body
CHANGED
File without changes
|
3
現状の追加
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
ルーティングを追加
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
入力欄のコードを追加
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
|