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

回答編集履歴

2

コメントのIPが保存されない件について回答を追記しました

2017/01/20 08:35

投稿

mingos
mingos

スコア4312

answer CHANGED
@@ -1,3 +1,58 @@
1
+ ### 追記
2
+
3
+ まずは、気になるところを抜き出しますね。
4
+
5
+ ```ruby
6
+ # フォームの内容でコメントをデータベースへ保存
7
+ # その結果をCommentのインスタンスとして@commentで受け取る
8
+ @comment = @post.comments.create(comment_params)
9
+
10
+ # @comment.ipにIPアドレスを代入
11
+ # データベースには保存されず、メモリにあるだけ
12
+ @comment.ip = request.remote_ip
13
+ ...
14
+
15
+ # エラーチェックはするが、saveしていないので
16
+ # @comment.ipはデータベースに入らない
17
+ if @comment.valid?
18
+ ...
19
+ end
20
+ ```
21
+
22
+ コメントをつけたので、なんとなく原因が分かったかもしれませんが、
23
+ valid?を呼び出すならば、createはしないほうがいいです。
24
+ createの中でvalid?も読んでくれるのですが、流れとしておかしくなるので。
25
+
26
+ 以下の流れに沿ったコードを記載します。
27
+
28
+ - フォームの値を@commentにセット
29
+ - @comment.ipにコメントを投稿した人のIPアドレスをセット
30
+ - @comment.valid?でエラーチェックし、問題なければ、@comment.saveでデータベースに保存
31
+
32
+ ```ruby
33
+ class CommentsController < ApplicationController
34
+ def create
35
+ @post = Post.find(params[:post_id])
36
+
37
+ # データベースに保存せずにインスタンスを作るだけ
38
+ @comment = @post.comments.new(comment_params)
39
+ @comment.ip = request.remote_ip
40
+ p request.remote_ip
41
+ p @comment.ip
42
+
43
+ respond_to do |format|
44
+ # エラーチェック&保存
45
+ if @comment.valid? && @comment.save
46
+ format.html { redirect_to post_path(@post), notice: 'コメントが完了しました!!' }
47
+ else
48
+ format.html { redirect_to post_path(@post), notice: 'コメントに失敗しました。ニックネームとコメントを入れてください。' }
49
+ end
50
+ end
51
+ end
52
+ ```
53
+
54
+ ### 以前の回答
55
+
1
56
  コントローラ内でrequest.remote_ipを呼べば取得する事が出来ます。
2
57
 
3
58
  マイグレーションは予想がついたという事ですが、一応書いておくこんな感じです。

1

コードのサンプルを追記

2017/01/20 08:35

投稿

mingos
mingos

スコア4312

answer CHANGED
@@ -1,1 +1,25 @@
1
- コントローラ内でrequest.remote_ipを呼べば取得する事が出来ます。
1
+ コントローラ内でrequest.remote_ipを呼べば取得する事が出来ます。
2
+
3
+ マイグレーションは予想がついたという事ですが、一応書いておくこんな感じです。
4
+ モデル名は仮なのでそちらの環境に合わせてください。
5
+ 必要そうなところだけを書くとこうなるかと。
6
+ ```ruby
7
+ class CreatePosts < ActiveRecord::Migration
8
+ def change
9
+ create_table :posts do |t|
10
+ ...
11
+ t.string :remote_ip, null: false
12
+ ...
13
+ end
14
+ end
15
+ end
16
+
17
+ class XxxController < ApplicationController
18
+ def xxxx
19
+ post = Post.new(params[:post].permit!)
20
+ post.remote_ip = request.remote_ip
21
+ ...
22
+ post.save
23
+ end
24
+ end
25
+ ```