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

質問編集履歴

14

質問内容の修正

2019/05/22 02:56

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -3,7 +3,10 @@
3
3
  Rails で言語ラベルつきの可変個数の画像アップローダーからきた画像データを
4
4
  AWS S3 にアップロードしつつ MySQL の1カラムにURLを JSON 形式で保存したいです
5
5
 
6
+ Rails 的には1フォーム:1カラムに対応させてと分けたほうが都合がいいのですが
7
+ API側の都合で入力内容を1カラムにまとめたいです
6
8
 
9
+
7
10
  ### 発生している問題
8
11
 
9
12
  ActionDispatch 型でとんできたパラメーターを

13

質問内容の修正

2019/05/22 02:56

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -153,4 +153,17 @@
153
153
 
154
154
  ### 補足情報(FW/ツールのバージョンなど)
155
155
 
156
- Rails 4.2.3 です
156
+ Rails 4.2.3 です
157
+
158
+ ##追記
159
+
160
+ ```
161
+ def image=(val)
162
+ @image = MultiLocale.new(val)
163
+ end
164
+ ```
165
+
166
+ をオーバーライドしなければデフォルトではどういう挙動をするのでしょうか
167
+ @変数 にかきこめばそれ(をシリアライズしたもの)がカラムになる?
168
+ と思っていたのですがどうやら違うようです
169
+ save のときに MySQL に書き込まれる値はどこに保持されているのでしょうか

12

質問内容の修正

2019/05/22 02:15

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -17,8 +17,8 @@
17
17
  ```
18
18
  <%= form_for @campaign do |f| %>
19
19
  <%= f.fields_for :image do |f| %>
20
- <%= f.file_field :default %><%= img_tag f.object.image.default %>
20
+ <%= f.file_field :default %><%= image_tag f.object.image.default %>
21
- <%= f.file_field :ja %> <%= img_tag f.object.image.ja %>
21
+ <%= f.file_field :ja %> <%= image_tag f.object.image.ja %>
22
22
  :
23
23
  ```
24
24
  のようにかいたところ

11

質問内容の修正

2019/05/21 23:51

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -17,14 +17,12 @@
17
17
  ```
18
18
  <%= form_for @campaign do |f| %>
19
19
  <%= f.fields_for :image do |f| %>
20
- <%= f.file_field :default %>
20
+ <%= f.file_field :default %><%= img_tag f.object.image.default %>
21
- <%= f.file_field :ja %>
21
+ <%= f.file_field :ja %> <%= img_tag f.object.image.ja %>
22
22
  :
23
23
  ```
24
- かいたところ
24
+ のようにかいたところ
25
- `
26
- "image"=>{"default"=>#<ActionDispatch::Http::UploadedFile:...}
25
+ `"image"=>{"default"=>#<ActionDispatch::Http::UploadedFile:...}`
27
- `
28
26
  という形でとんできます
29
27
 
30
28
  これを
@@ -66,9 +64,7 @@
66
64
  ```
67
65
  とパラメーターをうけとったときに MultiLocale オブジェクトとして保存するセッターをかいたんですが
68
66
  デバッグ表示されたデータは
69
- `
70
- {"default" => {"tempfile"=>[], "original_filename"=>"150x150.png", "content_type"=>"image/png", "headers"=>"Content-Disposition: form-data; name=\"campaign[image][default]\"; filename=\"150x150.png\"\r\nContent-Type: image/png\r\n"}
71
- `
67
+ `{"default" => {"tempfile"=>[], "original_filename"=>"150x150.png", "content_type"=>"image/png", "headers"=>"Content-Disposition: form-data; name=\"campaign[image][default]\"; filename=\"150x150.png\"\r\nContent-Type: image/png\r\n"}`
72
68
  とハッシュ型になってしまい ActionDispatch 型ではなくなってしまいます
73
69
 
74
70
  ActionDispatch 型でないと CarrierWave に渡せないので
@@ -80,9 +76,7 @@
80
76
  end
81
77
  ```
82
78
  というセッターを定義したところようやく @image の中身が
83
- `
84
- <MultiLocale @default=#<ActionDispatch::Http::UploadedFile:...>}
79
+ `<MultiLocale @default=#<ActionDispatch::Http::UploadedFile:...>} `
85
- `
86
80
  という形でパラメータを受け取ることができたので
87
81
 
88
82
  before_validation 内で

10

質問内容の修正

2019/05/21 23:51

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -6,8 +6,9 @@
6
6
 
7
7
  ### 発生している問題
8
8
 
9
+ ActionDispatch 型でとんできたパラメーターを
9
- アップロードしてURLを取得する部分はようやく動くようになったのですが
10
+ S3 にアップロードして URL を取得する部分はようやく動くようになったのですが
10
- フォームからきたハッシュをコントローラー上でどう扱って最終的にどうJSONにしていいのかがわかりません
11
+ フォームからきたハッシュをコントローラー上でどう扱って最終的にどう JSON にしていいのかがわかりません
11
12
 
12
13
 
13
14
  ### 試したこと

9

質問内容の修正

2019/05/21 23:47

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -3,13 +3,13 @@
3
3
  Rails で言語ラベルつきの可変個数の画像アップローダーからきた画像データを
4
4
  AWS S3 にアップロードしつつ MySQL の1カラムにURLを JSON 形式で保存したいです
5
5
 
6
+
6
7
  ### 発生している問題
7
8
 
8
9
  アップロードしてURLを取得する部分はようやく動くようになったのですが
9
10
  フォームからきたハッシュをコントローラー上でどう扱って最終的にどうJSONにしていいのかがわかりません
10
- いろいろ試行錯誤してるのですが、バリデーションや保存、更新、再表示すべてがうまく動かず
11
- 1つ動くと別の場所が動かなくなるの繰り返しで困っています
12
11
 
12
+
13
13
  ### 試したこと
14
14
 
15
15
  view
@@ -142,7 +142,20 @@
142
142
  とくに カラムのデータ @変数 セッターゲッター []でのアクセス あたりがあいまいで区別ができていないために
143
143
  どこでどのデータにどの型が入っているかが把握できていなくてはまっています
144
144
 
145
+ まとめると
145
146
 
147
+ ① ActionDispatch 型でもっている画像データをアップロードフォームに再セットしたい
148
+ (ローカルのファイルを勝手にセットすることはできないけど
149
+ Blob オブジェクトを作ることができればファイルフィールドにセットすることは可能みたいなのですが
150
+ どういう JS を生成すればいいかがわかりません)
151
+
152
+ ② カラムと同名の @変数でもっている値を save 時に MySQL カラムに保存するにはどうすればいいでしょうか
153
+
154
+ ③ そもそも途中で MultiLocale 型という独自モデルを定義して保持するというのが適切なやり方なのでしょうか
155
+
156
+ 以上 3 点よろしくおねがいします
157
+
158
+
146
159
  ### 補足情報(FW/ツールのバージョンなど)
147
160
 
148
161
  Rails 4.2.3 です

8

質問内容の修正

2019/05/21 23:46

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -123,7 +123,7 @@
123
123
  @image
124
124
  end
125
125
  ```
126
- とゲッターを追加するとバリデーションは通るようになりますが今度は MySQL エラーで image の default value がないといわれます
126
+ とゲッターを追加するとバリデーションは通るようになりますが今度は MySQL エラーで image の default value がないといわれます
127
127
  @image に保存したい内容を MultiLocale 型でもっているのですが
128
128
  どうも MySQL に保存するときにこの値をみてくれていないようなのです
129
129
  MySQL に JSON で保存するにはどうすればいいんでしょうか?

7

質問内容の修正

2019/05/21 23:35

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -77,12 +77,8 @@
77
77
  @image = MultiLocale.new(val)
78
78
  p @image
79
79
  end
80
-
81
- def image
82
- @image
83
- end
84
80
  ```
85
- というゲッターセッターを定義したところようやく @image の中身が
81
+ というセッターを定義したところようやく @image の中身が
86
82
  `
87
83
  <MultiLocale @default=#<ActionDispatch::Http::UploadedFile:...>}
88
84
  `
@@ -122,7 +118,14 @@
122
118
  validates :image, presence: true
123
119
  `
124
120
  のバリデーションにひっかかって画像がないというバリデーションエラーになってしまいます
121
+ ```
122
+ def image
123
+ @image
124
+ end
125
+ ```
126
+ とゲッターを追加するとバリデーションは通るようになりますが今度は MySQL エラーで image の default value がないといわれます
125
127
  @image に保存したい内容を MultiLocale 型でもっているのですが
128
+ どうも MySQL に保存するときにこの値をみてくれていないようなのです
126
129
  MySQL に JSON で保存するにはどうすればいいんでしょうか?
127
130
 
128
131
  画像以外のカラムはセッターをかいていなくて、MutiLocale 型から自動的に JSON で保存してくれますが

6

質問内容の修正

2019/05/21 23:34

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -63,7 +63,8 @@
63
63
  p image
64
64
  end
65
65
  ```
66
- とパラメーターをうけとったときに MultiLocale オブジェクトとして保存するセッターをかいたんですが表示されたデータは
66
+ とパラメーターをうけとったときに MultiLocale オブジェクトとして保存するセッターをかいたんですが
67
+ デバッグ表示されたデータは
67
68
  `
68
69
  {"default" => {"tempfile"=>[], "original_filename"=>"150x150.png", "content_type"=>"image/png", "headers"=>"Content-Disposition: form-data; name=\"campaign[image][default]\"; filename=\"150x150.png\"\r\nContent-Type: image/png\r\n"}
69
70
  `

5

質問内容の修正

2019/05/21 23:29

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -63,7 +63,7 @@
63
63
  p image
64
64
  end
65
65
  ```
66
- とかいたんですが表示されたデータは
66
+ パラメーターをうけとったときに MultiLocale オブジェクトとして保存するセッターをかいたんですが表示されたデータは
67
67
  `
68
68
  {"default" => {"tempfile"=>[], "original_filename"=>"150x150.png", "content_type"=>"image/png", "headers"=>"Content-Disposition: form-data; name=\"campaign[image][default]\"; filename=\"150x150.png\"\r\nContent-Type: image/png\r\n"}
69
69
  `
@@ -107,7 +107,7 @@
107
107
  `
108
108
  となり、バリデーションエラーでビューに戻ったとき、アップロードされた画像が表示できるようになりました
109
109
 
110
- ただ途中でバリデーションエラーが出た場合等に ActionDispatch と変換されたURL文字列が混在することになり、
110
+ ただ途中でバリデーションエラーが出た場合等に ActionDispatch と変換された URL 文字列が混在することになり、
111
111
  (たとえば 2 つめの画像保存に失敗した場合)
112
112
  ```
113
113
  <MultiLocale @default="https://S3のURL" @ja=#<ActionDispatch::Http::UploadedFile:...> >
@@ -121,13 +121,16 @@
121
121
  validates :image, presence: true
122
122
  `
123
123
  のバリデーションにひっかかって画像がないというバリデーションエラーになってしまいます
124
- @image に保存したい内容をMultiLocale型でもっているのですが
124
+ @image に保存したい内容を MultiLocale 型でもっているのですが
125
- MySQL に保存するにはどうすればいいんでしょうか?
125
+ MySQL に JSON で保存するにはどうすればいいんでしょうか?
126
+
127
+ 画像以外のカラムはセッターをかいていなくて、MutiLocale 型から自動的に JSON で保存してくれますが
128
+ 画像の場合だけセッターをかいてしまってるせいで保存されないみたいなのです
126
129
  ```
127
130
  self.image = @image
128
131
  ```
129
132
  をよんでもセッターをオーバーライドしてしまっているので @image が更新されてしまうだけで
130
- MySQL にセットされる値に @image.to_json をセットするにはどうすればいいんでしょうか
133
+ MySQL にセットされる値をセットするにはどうすればいいんでしょうか
131
134
 
132
135
  Rails にまだそれほどなれていなくて完全に自己流なので、明らかに変なことをやってる気がするのですが
133
136
  ベストプラクティスを教えていただきたいです

4

質問内容の修正

2019/05/21 23:27

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -93,8 +93,11 @@
93
93
  @image.each{|k,v|
94
94
  image = CampaignImage.new # CarrierWave マウントクラス
95
95
  image.image = v
96
- image.save
96
+ if image.save
97
- tmp[k] = image.image.url
97
+ tmp[k] = image.image.url
98
+ else
99
+ errors.add(:image, I18n.t('.invalid_image'))
100
+ end
98
101
  }
99
102
  @image = MultiLocale.new(tmp)
100
103
  ```
@@ -102,10 +105,15 @@
102
105
  `
103
106
  <MultiLocale @default="https://S3のURL" >
104
107
  `
105
- となり、バリデーションエラーでビューに戻ったとき、アップロードされた画像が表示できるようになりますが
108
+ となり、バリデーションエラーでビューに戻ったとき、アップロードされた画像が表示できるようになりました
106
- 途中でバリデーションエラーが出た場合等に ActionDispatch と変換されたURLが混在することになり、
107
- ActionDispatch のままのものは画像が表示されません
108
109
 
110
+ ただ途中でバリデーションエラーが出た場合等に ActionDispatch と変換されたURL文字列が混在することになり、
111
+ (たとえば 2 つめの画像保存に失敗した場合)
112
+ ```
113
+ <MultiLocale @default="https://S3のURL" @ja=#<ActionDispatch::Http::UploadedFile:...> >
114
+ ```
115
+ という状態になって ActionDispatch のままのものは画像が表示されません
116
+
109
117
  ①この状態でビューに戻った場合にもう1度 ActionDispatch から form にデータをセットする方法はないでしょうか?
110
118
 
111
119
  ②またこの状態で保存しようとすると

3

質問内容の修正

2019/05/21 17:07

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -96,7 +96,7 @@
96
96
  image.save
97
97
  tmp[k] = image.image.url
98
98
  }
99
- @image = tmp
99
+ @image = MultiLocale.new(tmp)
100
100
  ```
101
101
  とアップロードとURLの取得を行って成功した場合 @image の中身は
102
102
  `

2

質問内容の修正

2019/05/21 17:03

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -41,6 +41,8 @@
41
41
  @@langs = ['default'] + I18n.available_locales.map(&:to_s)
42
42
  attr_accessor *@@langs
43
43
 
44
+ # ここがよく意味がわかってないのですが
45
+ # こうかいて serialize を定義すると勝手に JSON で保存してくれるらしい?
44
46
  class << self
45
47
  def dump(obj)
46
48
  obj.to_json if obj

1

質問内容の修正

2019/05/21 17:02

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -74,12 +74,16 @@
74
74
  @image = MultiLocale.new(val)
75
75
  p @image
76
76
  end
77
+
78
+ def image
79
+ @image
80
+ end
77
81
  ```
78
- というセッターを定義したところようやく
82
+ というゲッターセッターを定義したところようやく @image の中身が
79
83
  `
80
84
  <MultiLocale @default=#<ActionDispatch::Http::UploadedFile:...>}
81
85
  `
82
- パラメータを受け取ることができたので
86
+ いう形でパラメータを受け取ることができたので
83
87
 
84
88
  before_validation 内で
85
89
  ```
@@ -108,10 +112,10 @@
108
112
  `
109
113
  のバリデーションにひっかかって画像がないというバリデーションエラーになってしまいます
110
114
  @image に保存したい内容をMultiLocale型でもっているのですが
111
- MySQL に保存するにはどうすればいいんでしょうか
115
+ MySQL に保存するにはどうすればいいんでしょうか
112
-
116
+ ```
113
117
  self.image = @image
114
-
118
+ ```
115
119
  をよんでもセッターをオーバーライドしてしまっているので @image が更新されてしまうだけで
116
120
  MySQL にセットされる値に @image.to_json をセットするにはどうすればいいんでしょうか
117
121