質問編集履歴
14
質問内容の修正
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
質問内容の修正
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
質問内容の修正
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 %><%=
|
20
|
+
<%= f.file_field :default %><%= image_tag f.object.image.default %>
|
21
|
-
<%= f.file_field :ja %> <%=
|
21
|
+
<%= f.file_field :ja %> <%= image_tag f.object.image.ja %>
|
22
22
|
:
|
23
23
|
```
|
24
24
|
のようにかいたところ
|
11
質問内容の修正
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
質問内容の修正
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
質問内容の修正
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
質問内容の修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -123,7 +123,7 @@
|
|
123
123
|
@image
|
124
124
|
end
|
125
125
|
```
|
126
|
-
とゲッターを追加するとバリデーションは通るようになりますが今度は MySQL エラーで
|
126
|
+
とゲッターを追加するとバリデーションは通るようになりますが今度は MySQL エラーで image の default value がないといわれます
|
127
127
|
@image に保存したい内容を MultiLocale 型でもっているのですが
|
128
128
|
どうも MySQL に保存するときにこの値をみてくれていないようなのです
|
129
129
|
MySQL に JSON で保存するにはどうすればいいんでしょうか?
|
7
質問内容の修正
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
|
-
という
|
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
質問内容の修正
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
質問内容の修正
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 にセットされる値
|
133
|
+
MySQL にセットされる値をセットするにはどうすればいいんでしょうか
|
131
134
|
|
132
135
|
Rails にまだそれほどなれていなくて完全に自己流なので、明らかに変なことをやってる気がするのですが
|
133
136
|
ベストプラクティスを教えていただきたいです
|
4
質問内容の修正
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
|
-
|
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
質問内容の修正
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
質問内容の修正
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
質問内容の修正
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
|
|