質問編集履歴

6

読みやすく修正

2020/08/31 11:02

投稿

75ks
75ks

スコア4

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  検索機能を実装したいのですがうまく動きません。
6
6
 
7
- 具体的には`ALL`,` MEN`, `WOMEN`の3つのボタンを作り、`ALL`の時には全てのレコード、`MEN`の時には男性のレコード、`WOMEN`の時には女性のレコードを表示する機能です。
7
+ 具体的には`ALL`,`MEN`, `WOMEN`の3つのボタンを作り、`ALL`の時には全てのレコード、`MEN`の時には男性のレコード、`WOMEN`の時には女性のレコードを表示する機能です。
8
8
 
9
9
 
10
10
 
@@ -14,7 +14,9 @@
14
14
 
15
15
  ユーザーは`usersテーブル`という名前で、投稿は`postsテーブル`という名前を使っていて、ユーザーは`devise`を使っています。
16
16
 
17
+ `gender_id`は`Active Hash`を使っています。
18
+
17
- `user`と`post`は、1:Nの関係です。
19
+ `user`と`post`は、`1:N`の関係です。
18
20
 
19
21
  検索のために`searchアクション`を定義しています。
20
22
 

5

本文の修正

2020/08/31 11:02

投稿

75ks
75ks

スコア4

test CHANGED
File without changes
test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
 
10
10
 
11
- 現在のコードでは、`ALL`の時には全てのレコード、`MEN`の時には男性のレコード、`WOMEN`の時にも男性のレコードが表示されてしまいます。
11
+ 現在のコードでは、`ALL`の時には全てのレコード、`MEN`の時には男性のレコード、なぜか`WOMEN`の時にも男性のレコードが表示されてしまいます。
12
12
 
13
13
 
14
14
 

4

わかりやすく文章とコードを編集

2020/08/31 11:00

投稿

75ks
75ks

スコア4

test CHANGED
File without changes
test CHANGED
@@ -1,68 +1,82 @@
1
- #Ruby on Rails
2
-
3
- 一覧ページにある`link_to`を押した時に、子モデル(postモデル)のレコードを、親モデル(userモデル)のカラムである性別(gender_id)で検索する方法を教えていただきたいです。
4
-
5
- gender_idはAcrtive Hash使っています。
1
+ Ruby on Railsで写真とテキスト投稿できるSNSを作っています。
6
2
 
7
3
 
8
4
 
5
+ 検索機能を実装したいのですがうまく動きません。
6
+
9
- 検索ため`search`アクションを作成し、`post`モデルに`joins``where`を使って検索のコードを記述をしましたが、上手くいかず、原因がわかりません
7
+ 具体的には`ALL`,` MEN`, `WOMEN`3つボタンを作、`ALL`の時は全てのレコード、`MEN`の時には男性のレコード、`WOMEN`の時には女性のレコードを表示する機能です
10
8
 
11
9
 
12
10
 
13
- ```indexhtmlerb
11
+ 現在のコードでは、`ALL`の時には全てのレコード、`MEN`の時には男性のレコード、`WOMEN`の時にも男性のレコードが表示されてしまいます。
14
12
 
15
- <ul class="gender-lists">
16
13
 
17
- <li>
18
14
 
19
- <%= link_to "ALL", root_path, class:"gender" %>
15
+ ユーザーは`usersテーブル`という名前で、投稿は`postsテーブル`という名前を使っていて、ユーザーは`devise`を使っています。
20
16
 
21
- </li>
17
+ `user`と`post`は、「1:N」の関係です。
22
18
 
23
- <li>
19
+ 検索のために`searchアクション`を定義しています。
24
20
 
25
- <%= link_to "MEN", search_posts_path(gender_id:2), class:"gender" %>
21
+ `search.html.erb`は`index.htl.erb`と同じコードにしています。
26
22
 
27
- </li>
28
23
 
29
- <li>
30
24
 
31
- <%= link_to "WOMEN", search_posts_path(gender_id:3), class:"gender" %>
32
25
 
33
- </li>
34
26
 
27
+ ###ソースコード
28
+
35
- </ul>
29
+ ```controller
30
+
31
+ -----省略
32
+
33
+
34
+
35
+ def search
36
+
37
+ @posts = Post.search(params[:gender_id])
38
+
39
+ end
40
+
41
+
42
+
43
+ -----省略
36
44
 
37
45
  ```
38
46
 
39
47
 
40
48
 
41
- ```gendermodel
49
+ ```routes
42
50
 
43
- class Gender < ActiveHash::Base
51
+ Rails.application.routes.draw do
44
52
 
45
- self.data = [
53
+ devise_for :users
46
54
 
47
- { id: 1, name: '---' },
55
+ root "posts#index"
48
56
 
49
- { id: 2, name: 'MEN' },
57
+ resources :posts, only: [:new, :create, :show, :destroy, :edit, :update] do
50
58
 
51
- { id: 3, name: 'WOMEN' },
59
+ resources :comments, only: :create
52
60
 
53
- { id: 4, name: '選択しない' }
61
+ collection do
54
62
 
63
+ get "search"
64
+
55
- ]
65
+ end
56
66
 
57
67
  end
58
68
 
59
-
69
+ resources :users, only: :show
70
+
71
+ end
72
+
73
+
60
74
 
61
75
  ```
62
76
 
63
77
 
64
78
 
65
- ```postmodel
79
+ ```model
66
80
 
67
81
  class Post < ApplicationRecord
68
82
 
@@ -92,17 +106,13 @@
92
106
 
93
107
  def self.search(search)
94
108
 
95
- if search == 2
109
+ if search = 2
96
110
 
97
111
  Post.joins(:user).where("users.gender_id = 2")
98
112
 
99
- elsif search == 3
113
+ elsif search = 3
100
114
 
101
115
  Post.joins(:user).where("users.gender_id = 3")
102
-
103
- else
104
-
105
- Post.includes(:user).order("created_at DESC")
106
116
 
107
117
  end
108
118
 
@@ -116,242 +126,36 @@
116
126
 
117
127
 
118
128
 
119
- ```usermodel
129
+ ```indexhtmlerb
120
130
 
121
- class User < ApplicationRecord
131
+ -------省略
122
-
123
- # Include default devise modules. Others available are:
124
-
125
- # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
126
-
127
- devise :database_authenticatable, :registerable,
128
-
129
- :recoverable, :rememberable, :validatable
130
132
 
131
133
 
132
134
 
133
- extend ActiveHash::Associations::ActiveRecordExtensions
135
+ <ul class="gender-lists">
134
136
 
135
- belongs_to_active_hash :gender
137
+ <li>
136
138
 
137
- has_many :posts, dependent: :destroy
139
+ <%= link_to "ALL", root_path, class:"gender" %>
138
140
 
141
+ </li>
142
+
143
+ <li>
144
+
139
- has_many :comments, dependent: :destroy
145
+ <%= link_to "MEN", search_posts_path(gender_id:2), class:"gender" %>
146
+
147
+ </li>
148
+
149
+ <li>
150
+
151
+ <%= link_to "WOMEN", search_posts_path(gender_id:3), class:"gender" %>
152
+
153
+ </li>
154
+
155
+ </ul>
140
156
 
141
157
 
142
158
 
143
- with_options presence: true do
144
-
145
- validates :nickname
159
+ -------省略
146
-
147
- validates :gender_id
148
-
149
- end
150
-
151
-
152
-
153
- validates :email, uniqueness: true
154
-
155
-
156
-
157
- validates :nickname, length: { maximum: 8, message: "は8文字以下にしてください" }
158
-
159
-
160
-
161
- validates :gender_id, numericality: { other_than: 1, message: "を選択してください" }
162
-
163
-
164
-
165
- half_width_alphanumeric = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{6,100}+\z/i
166
-
167
- validates :password, presence: true, format: { with: half_width_alphanumeric, message: "に半角英数字を使用してください" }
168
-
169
- end
170
-
171
-
172
160
 
173
161
  ```
174
-
175
-
176
-
177
- ```postcontroller
178
-
179
- class PostsController < ApplicationController
180
-
181
- before_action :set_post, only: [:show, :destroy, :edit, :update]
182
-
183
- before_action :correct_user, only: [:edit, :update]
184
-
185
-
186
-
187
- def index
188
-
189
- @posts = Post.includes(:user).order("created_at DESC")
190
-
191
- end
192
-
193
-
194
-
195
- def new
196
-
197
- @post = Post.new
198
-
199
- end
200
-
201
-
202
-
203
- def create
204
-
205
- @post = Post.new(post_params)
206
-
207
- if @post.valid?
208
-
209
- @post.save
210
-
211
- flash[:notice] = "投稿が完了しました"
212
-
213
- redirect_to root_path
214
-
215
- else
216
-
217
- flash.now[:alert] = "投稿に失敗しました"
218
-
219
- render :new
220
-
221
- end
222
-
223
- end
224
-
225
-
226
-
227
- def show
228
-
229
- @comment = Comment.new
230
-
231
- @comments = @post.comments.includes(:user)
232
-
233
- end
234
-
235
-
236
-
237
- def destroy
238
-
239
- if @post.destroy
240
-
241
- flash[:notice] = "削除が完了しました"
242
-
243
- redirect_to root_path
244
-
245
- else
246
-
247
- flash.now[:alert] = "削除に失敗しました"
248
-
249
- render :show
250
-
251
- end
252
-
253
- end
254
-
255
-
256
-
257
- def edit
258
-
259
- end
260
-
261
-
262
-
263
- def update
264
-
265
- if @post.update(post_params)
266
-
267
- flash[:notice] = "編集が完了しました"
268
-
269
- redirect_to post_path(@post.id)
270
-
271
- else
272
-
273
- flash.now[:alert] = "編集に失敗しました"
274
-
275
- render :edit
276
-
277
- end
278
-
279
- end
280
-
281
-
282
-
283
- def search
284
-
285
- @posts = Post.search(params[:gender_id])
286
-
287
- end
288
-
289
-
290
-
291
- private
292
-
293
-
294
-
295
- def post_params
296
-
297
- params.require(:post).permit(:text, images: []).merge(user_id: current_user.id)
298
-
299
- end
300
-
301
-
302
-
303
- def set_post
304
-
305
- @post = Post.find(params[:id])
306
-
307
- end
308
-
309
-
310
-
311
- def correct_user
312
-
313
- unless user_signed_in? && current_user.id == @post.user.id
314
-
315
- redirect_to root_path
316
-
317
- end
318
-
319
- end
320
-
321
- end
322
-
323
-
324
-
325
- ```
326
-
327
- .
328
-
329
- .
330
-
331
- .
332
-
333
-
334
-
335
- --------------追記---------------------
336
-
337
- `postmodel`の`self.search`の記述を下記のように`search == 2`から `search = 2`のように書き換えたところ、
338
-
339
- `MEN`のボタンを押したときは男性だけの投稿になりましたが、`WOMEN`のボタンを押しても男性の投稿になってしまいます。
340
-
341
-
342
-
343
- ```postmodel
344
-
345
- def self.search(search)
346
-
347
- if search = 2
348
-
349
- Post.joins(:user).where("users.gender_id = 2")
350
-
351
- elsif search = 3
352
-
353
- Post.joins(:user).where("users.gender_id = 3")
354
-
355
- end
356
-
357
- ```

3

誤字の修正

2020/08/31 10:52

投稿

75ks
75ks

スコア4

test CHANGED
File without changes
test CHANGED
@@ -336,7 +336,7 @@
336
336
 
337
337
  `postmodel`の`self.search`の記述を下記のように`search == 2`から `search = 2`のように書き換えたところ、
338
338
 
339
- `MEN`のボタンを押したときは男性だけの投稿になりましたが、`WEMEN`のボタンを押しても男性の投稿になってしまいます。
339
+ `MEN`のボタンを押したときは男性だけの投稿になりましたが、`WOMEN`のボタンを押しても男性の投稿になってしまいます。
340
340
 
341
341
 
342
342
 

2

情報の更新

2020/08/31 09:35

投稿

75ks
75ks

スコア4

test CHANGED
File without changes
test CHANGED
@@ -323,3 +323,35 @@
323
323
 
324
324
 
325
325
  ```
326
+
327
+ .
328
+
329
+ .
330
+
331
+ .
332
+
333
+
334
+
335
+ --------------追記---------------------
336
+
337
+ `postmodel`の`self.search`の記述を下記のように`search == 2`から `search = 2`のように書き換えたところ、
338
+
339
+ `MEN`のボタンを押したときは男性だけの投稿になりましたが、`WEMEN`のボタンを押しても男性の投稿になってしまいます。
340
+
341
+
342
+
343
+ ```postmodel
344
+
345
+ def self.search(search)
346
+
347
+ if search = 2
348
+
349
+ Post.joins(:user).where("users.gender_id = 2")
350
+
351
+ elsif search = 3
352
+
353
+ Post.joins(:user).where("users.gender_id = 3")
354
+
355
+ end
356
+
357
+ ```

1

情報の追加

2020/08/31 09:27

投稿

75ks
75ks

スコア4

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
1
1
  #Ruby on Rails
2
2
 
3
- 子モデル(postモデル)のレコードを、親モデル(userモデル)のカラムである性別(gender_id)で検索する方法を教えていただきたいです。
3
+ 一覧ページにある`link_to`を押した時に、子モデル(postモデル)のレコードを、親モデル(userモデル)のカラムである性別(gender_id)で検索する方法を教えていただきたいです。
4
4
 
5
5
  gender_idはAcrtive Hashを使っています。
6
6
 
@@ -10,6 +10,34 @@
10
10
 
11
11
 
12
12
 
13
+ ```indexhtmlerb
14
+
15
+ <ul class="gender-lists">
16
+
17
+ <li>
18
+
19
+ <%= link_to "ALL", root_path, class:"gender" %>
20
+
21
+ </li>
22
+
23
+ <li>
24
+
25
+ <%= link_to "MEN", search_posts_path(gender_id:2), class:"gender" %>
26
+
27
+ </li>
28
+
29
+ <li>
30
+
31
+ <%= link_to "WOMEN", search_posts_path(gender_id:3), class:"gender" %>
32
+
33
+ </li>
34
+
35
+ </ul>
36
+
37
+ ```
38
+
39
+
40
+
13
41
  ```gendermodel
14
42
 
15
43
  class Gender < ActiveHash::Base