質問編集履歴

5

ビューの全体像を追加

2020/05/01 11:22

投稿

tomohiro2525
tomohiro2525

スコア12

test CHANGED
File without changes
test CHANGED
@@ -1,11 +1,23 @@
1
+ 現在、シェアハウスのマッチングアプリを作成中です。
2
+
3
+ イメージとして次のような動きをします。
4
+
5
+
6
+
7
+ 1募集主が同居の募集する
8
+
9
+ 2他者が募集に応募する
10
+
11
+ 3募集主が応募に対して、許可をする
12
+
13
+
14
+
1
15
  データベースに値がある場合trueを返すメソッドの作成について教えていただきたいと思います。
2
16
 
3
17
  find_byやwhereで値を探し出しcountでtrueやfalseを返す形のメソッドを検討しているのですが、どうしても各IDごとで返す方法がわかりませんでした。テーブルごとで返すのではなく、ID個別に値を返す方法がありましたら、ぜひご教示いただければと思います。よろしくお願いいたします。
4
18
 
5
19
 
6
20
 
7
- ok_requestの値を返すメソッドを検討しています。
8
-
9
21
  ```MySQL
10
22
 
11
23
  mysql> select * from shares;
@@ -40,92 +52,278 @@
40
52
 
41
53
 
42
54
 
55
+ ●user.rb
56
+
43
57
  ```Ruby
44
58
 
45
- def permitted_appliments?(house)
59
+ class User < ApplicationRecord
60
+
46
-
61
+ validates :name, presence: true, length: { maximum: 50 }
62
+
47
-   
63
+ validates :email, presence: true, length: { maximum: 255 },
64
+
48
-
65
+ format: {with: /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i },
66
+
67
+ uniqueness: { case_sensitive: false }
68
+
69
+ has_secure_password
70
+
71
+
72
+
73
+ has_many :houses #募集との紐付け
74
+
75
+ has_many :shares #許可テーブルとの紐付け
76
+
77
+
78
+
79
+
80
+
81
+ has_many :requestings, through: :shares, source: :house #リクエストしている募集の取得
82
+
83
+ has_many :reverses_of_share, class_name: 'Share', foreign_key: 'ok_request' #自分の募集にリクエストしてくれているユーザーへの参照
84
+
85
+
86
+
87
+ def request(house) #申請する動き
88
+
89
+ self.shares.find_or_create_by(house_id: house.id)
90
+
49
- end
91
+ end
92
+
93
+
94
+
50
-
95
+ def unrequest(house) #申請を取り消す動き
96
+
97
+ request = self.shares.find_by(house_id: house.id)
98
+
99
+ request.destroy if request
100
+
101
+ end
102
+
103
+
104
+
105
+ def requesting?(house) #申請してるかの確認
106
+
107
+ self.requestings.include?(house)
108
+
109
+ end
110
+
111
+
112
+
113
+ #has_many :ok_requestings, through: :houses, source: :shares #許可している募集の取得
114
+
115
+ has_many :ok_requestings, through: :shares, :foreign_key => 'ok_request', source: :house
116
+
117
+
118
+
119
+ def ok_request?(house) #申請を許可してるかの確認
120
+
121
+ self.ok_requestings.include?(house)
122
+
123
+ end
124
+
125
+
126
+
127
+ def permitted_appliments?(house) #申請を許可してるかの確認
128
+
129
+ return self.shares.where(ok_request: 1)
130
+
131
+ end
132
+
133
+
134
+
135
+
136
+
137
+ def permit_share?(house) #申請を許可してるかの確認
138
+
139
+ count = self.shares.where(ok_request: 1).count
140
+
141
+ return resurt = count > 0
142
+
143
+ end
144
+
145
+
146
+
147
+ def permit_share?(zero="0") #申請を許可してるかの確認
148
+
149
+ count = Share.where(ok_request: true).count
150
+
151
+ count > 0 ? count.to_s : zero
152
+
153
+ end
154
+
155
+
156
+
157
+
158
+
159
+ has_many :favorites
160
+
161
+ has_many :likes, through: :favorites, source: :like
162
+
163
+
164
+
165
+ def like(house)
166
+
167
+ self.favorites.find_or_create_by(like_id: house.id)
168
+
169
+ end
170
+
171
+
172
+
173
+ def unlike(house)
174
+
175
+ like = self.favorites.find_by(like_id: house.id)
176
+
177
+ like.destroy if like
178
+
179
+ end
180
+
181
+
182
+
183
+ def like?(house)
184
+
185
+ self.likes.include?(house)
186
+
187
+ end
188
+
189
+
190
+
191
+ end
192
+
51
- ```
193
+ ```
52
-
53
-
54
-
194
+
195
+
196
+
55
- > 試したこと→以下のコードで実行してみましたが、うまく動作しませんでした。
197
+ ●_ok_button.html.erb(ボタン)
56
198
 
57
199
  ```Ruby
58
200
 
59
- def ok_request?(house) #申請してるかの確認
60
-
61
- self.ok_requestings.include?(house)
62
-
63
- end
64
-
65
-
66
-
67
- def permitted_appliments?(house)
68
-
69
- return self.shares.where(ok_request: 1)
70
-
71
- end
72
-
73
-
74
-
75
-
76
-
77
- def permit_share?(house) #申請してるかの確認
201
+ <% if current_user.permit_share?(house) %>
202
+
78
-
203
+ <%= form_with( url: unpermit_share_path, local: true, method: :delete) do |f| %>
204
+
79
- count = self.shares.where(ok_request: 1).count
205
+ <%= hidden_field_tag :user_id, user.id %>
206
+
80
-
207
+ <%= hidden_field_tag :house_id, house.id %>
208
+
209
+ <%= f.submit '許可の取り消し', class: 'btn btn-danger btn-block' %>
210
+
81
- return count > 0
211
+ <% end %>
82
-
212
+
83
- end
213
+ <% else %>
84
-
85
-
86
-
214
+
87
- def permit_share?(zero="0") #申請してるかの確認
215
+ <%= form_with( url: permit_share_path, local: true) do |f| %>
88
-
216
+
89
- count = Share.where(ok_request: true).count
217
+ <%= hidden_field_tag :user_id, user.id %>
90
-
218
+
91
- count > 0 ? count.to_s : zero
219
+ <%= hidden_field_tag :house_id, house.id %>
220
+
92
-
221
+ <%= f.submit '申請を許可する', class: 'btn btn-primary btn-block' %>
222
+
93
- end
223
+ <% end %>
224
+
94
-
225
+ <% end %>
95
-
96
-
226
+
97
- ```
227
+ ```
98
-
99
-
100
-
228
+
229
+
230
+
101
- 許可ボタン
231
+ _request_users.html.erb(ボタンをrenderするビューページ)
102
232
 
103
233
  ```Ruby
104
234
 
105
- <% if current_user.permit_share?(house) %>
235
+ <% house.shares.each do |share| %>
106
-
107
- <%= form_with( url: unpermit_share_path, local: true, method: :delete) do |f| %>
236
+
108
-
109
- <%= hidden_field_tag :user_id, user.id %>
237
+ <p><%= share.user.name %></p>
110
-
111
- <%= hidden_field_tag :house_id, house.id %>
238
+
112
-
113
- <%= f.submit '許可の取り消し', class: 'btn btn-danger btn-block' %>
114
-
115
- <% end %>
116
-
117
- <% else %>
118
-
119
- <%= form_with( url: permit_share_path, local: true) do |f| %>
120
-
121
- <%= hidden_field_tag :user_id, user.id %>
122
-
123
- <%= hidden_field_tag :house_id, house.id %>
124
-
125
- <%= f.submit '申請を許可する', class: 'btn btn-primary btn-block' %>
239
+ <%= render 'shares/ok_button', user: share.user, house: house %>
126
-
127
- <% end %>
128
240
 
129
241
  <% end %>
130
242
 
131
243
  ```
244
+
245
+
246
+
247
+ ●shares_controller.rb
248
+
249
+ ```Ruby
250
+
251
+ class SharesController < ApplicationController
252
+
253
+ before_action :require_user_logged_in
254
+
255
+
256
+
257
+ def create
258
+
259
+ house = House.find(params[:house_id])
260
+
261
+ current_user.request(house)
262
+
263
+ flash[:success] = '同居申請をしました。'
264
+
265
+ redirect_to houses_path
266
+
267
+ end
268
+
269
+
270
+
271
+ def destroy
272
+
273
+ house = House.find(params[:house_id])
274
+
275
+ current_user.unrequest(house)
276
+
277
+ flash[:success] = '同居申請を取り消しました'
278
+
279
+ redirect_to houses_path
280
+
281
+ end
282
+
283
+
284
+
285
+ def permit_share
286
+
287
+ share = Share.where(user_id: params[:user_id])
288
+
289
+ .where(house_id: params[:house_id])
290
+
291
+ if share
292
+
293
+ share.update(ok_request: true)
294
+
295
+ flash[:success] = '申請を許可しました。'
296
+
297
+ end
298
+
299
+ redirect_to house_path(params[:house_id])
300
+
301
+ end
302
+
303
+
304
+
305
+ def unpermit_share
306
+
307
+
308
+
309
+ share = Share.where(user_id: params[:user_id])
310
+
311
+ .where(house_id: params[:house_id])
312
+
313
+ if share
314
+
315
+ share.update(ok_request: false)
316
+
317
+ flash[:success] = '許可を取り消しました。'
318
+
319
+ end
320
+
321
+ redirect_to house_path(params[:house_id])
322
+
323
+ end
324
+
325
+
326
+
327
+ end
328
+
329
+ ```

4

ボタンのビューの追加

2020/05/01 11:22

投稿

tomohiro2525
tomohiro2525

スコア12

test CHANGED
File without changes
test CHANGED
@@ -95,3 +95,37 @@
95
95
 
96
96
 
97
97
  ```
98
+
99
+
100
+
101
+ ●許可ボタン
102
+
103
+ ```Ruby
104
+
105
+ <% if current_user.permit_share?(house) %>
106
+
107
+ <%= form_with( url: unpermit_share_path, local: true, method: :delete) do |f| %>
108
+
109
+ <%= hidden_field_tag :user_id, user.id %>
110
+
111
+ <%= hidden_field_tag :house_id, house.id %>
112
+
113
+ <%= f.submit '許可の取り消し', class: 'btn btn-danger btn-block' %>
114
+
115
+ <% end %>
116
+
117
+ <% else %>
118
+
119
+ <%= form_with( url: permit_share_path, local: true) do |f| %>
120
+
121
+ <%= hidden_field_tag :user_id, user.id %>
122
+
123
+ <%= hidden_field_tag :house_id, house.id %>
124
+
125
+ <%= f.submit '申請を許可する', class: 'btn btn-primary btn-block' %>
126
+
127
+ <% end %>
128
+
129
+ <% end %>
130
+
131
+ ```

3

MySQLの訂正

2020/04/30 10:23

投稿

tomohiro2525
tomohiro2525

スコア12

test CHANGED
File without changes
test CHANGED
@@ -7,6 +7,8 @@
7
7
  ok_requestの値を返すメソッドを検討しています。
8
8
 
9
9
  ```MySQL
10
+
11
+ mysql> select * from shares;
10
12
 
11
13
  +----+---------+----------+------------+---------------------+---------------------+
12
14
 
@@ -31,6 +33,8 @@
31
33
  | 15 | 1 | 5 | 0 | 2020-04-28 10:50:48 | 2020-04-28 10:50:48 |
32
34
 
33
35
  +----+---------+----------+------------+---------------------+---------------------+
36
+
37
+ 8 rows in set (0.00 sec)
34
38
 
35
39
  ```
36
40
 

2

試したことの追記

2020/04/30 07:41

投稿

tomohiro2525
tomohiro2525

スコア12

test CHANGED
File without changes
test CHANGED
@@ -45,3 +45,49 @@
45
45
  end
46
46
 
47
47
  ```
48
+
49
+
50
+
51
+ > 試したこと→以下のコードで実行してみましたが、うまく動作しませんでした。
52
+
53
+ ```Ruby
54
+
55
+ def ok_request?(house) #申請してるかの確認
56
+
57
+ self.ok_requestings.include?(house)
58
+
59
+ end
60
+
61
+
62
+
63
+ def permitted_appliments?(house)
64
+
65
+ return self.shares.where(ok_request: 1)
66
+
67
+ end
68
+
69
+
70
+
71
+
72
+
73
+ def permit_share?(house) #申請してるかの確認
74
+
75
+ count = self.shares.where(ok_request: 1).count
76
+
77
+ return count > 0
78
+
79
+ end
80
+
81
+
82
+
83
+ def permit_share?(zero="0") #申請してるかの確認
84
+
85
+ count = Share.where(ok_request: true).count
86
+
87
+ count > 0 ? count.to_s : zero
88
+
89
+ end
90
+
91
+
92
+
93
+ ```

1

Rubyのコードを記述

2020/04/30 07:38

投稿

tomohiro2525
tomohiro2525

スコア12

test CHANGED
File without changes
test CHANGED
@@ -3,6 +3,8 @@
3
3
  find_byやwhereで値を探し出しcountでtrueやfalseを返す形のメソッドを検討しているのですが、どうしても各IDごとで返す方法がわかりませんでした。テーブルごとで返すのではなく、ID個別に値を返す方法がありましたら、ぜひご教示いただければと思います。よろしくお願いいたします。
4
4
 
5
5
 
6
+
7
+ ok_requestの値を返すメソッドを検討しています。
6
8
 
7
9
  ```MySQL
8
10
 
@@ -31,3 +33,15 @@
31
33
  +----+---------+----------+------------+---------------------+---------------------+
32
34
 
33
35
  ```
36
+
37
+
38
+
39
+ ```Ruby
40
+
41
+ def permitted_appliments?(house)
42
+
43
+   
44
+
45
+ end
46
+
47
+ ```