質問編集履歴

2

タイトルをより適当なものへ変更

2018/04/02 03:44

投稿

tacro
tacro

スコア23

test CHANGED
@@ -1 +1 @@
1
- [Javascript]Rails側の変数の値をjsで編集したい
1
+ [Rails5][Javascript]Javascript上の変数の値をRails側に渡したい
test CHANGED
File without changes

1

試してみたことを追記

2018/04/02 03:44

投稿

tacro
tacro

スコア23

test CHANGED
File without changes
test CHANGED
@@ -272,9 +272,151 @@
272
272
 
273
273
  #試してみたこと
274
274
 
275
- `%input{name: "image_name", type: "hidden", value: @post.image_name, class: 'image_name' }/`をview埋め込ん、javascript上で使えるようにしたいのですが、`@post`が`nilclass`になってしまいます
276
-
277
- そもそも、これはrails側からjs側に値を渡す方法であり、js側からrailsの値を指定するのとはまた違っている気もしています…
275
+ Ruby側で`image_name`を該当のURL変更るように、以下のことを試みました。
276
+
277
+
278
+
279
+ ```Ruby
280
+
281
+ #Postモデル
282
+
283
+ class Post < ApplicationRecord
284
+
285
+ ...
286
+
287
+ attr_accessor :remote_image_url #JavascriptからURLを受け取る仮想属性を宣言
288
+
289
+ validates :image_name, {presence: true}
290
+
291
+ validates :designer_id, {presence: true}
292
+
293
+ end
294
+
295
+
296
+
297
+ ```
298
+
299
+
300
+
301
+ ```html
302
+
303
+ <%= form_for @post, :url => { :controller => :posts, :action => :create } ,html: { class: "directUpload", data: { 'form-data' => (@s3_direct_post.fields), 'url' => @s3_direct_post.url, 'host' => URI.parse(@s3_direct_post.url).host } } do |f|%>
304
+
305
+ <div class="field" >
306
+
307
+ <%= f.label("アイテム画像(必須)") %>
308
+
309
+ <%= f.file_field :image_name %>
310
+
311
+ <!--hidden fieldを置いて、アップロードした画像のURLを入れるようにする-->
312
+
313
+ <%= f.hidden_field :remote_image_url %>
314
+
315
+
316
+
317
+ ...
318
+
319
+ <% end %>
320
+
321
+ ```
322
+
323
+
324
+
325
+
326
+
327
+ ```javascript
328
+
329
+ $(function() {
330
+
331
+ ...
332
+
333
+ ...
334
+
335
+ done: function(e, data) {
336
+
337
+ ...
338
+
339
+ // extract key and generate URL from response
340
+
341
+ var key = $(data.jqXHR.responseXML).find("Key").text();
342
+
343
+ var url = '//' + form.data('host') + '/' + key;
344
+
345
+
346
+
347
+ // create hidden field
348
+
349
+ var input = $("<input />", { type:'hidden', name: fileInput.attr('name'), value: url });
350
+
351
+ $("#post_remote_image_url").val(url); //hidden_field内のremote_image_urlの値にURLを入れる
352
+
353
+ form.append(input);
354
+
355
+ },
356
+
357
+ ...
358
+
359
+ ...
360
+
361
+ });
362
+
363
+ ```
364
+
365
+
366
+
367
+ ```Ruby
368
+
369
+ class PostsController < ApplicationController
370
+
371
+ ...
372
+
373
+ def new
374
+
375
+ @post = Post.new
376
+
377
+ end
378
+
379
+
380
+
381
+ def create
382
+
383
+ post = params.require(:post).permit(
384
+
385
+ :designer_id,
386
+
387
+ :image_name,
388
+
389
+ :remote_image_url,
390
+
391
+ :detail
392
+
393
+ )
394
+
395
+ post[:image_name]= post[:remote_image_url] //image_nameの値にURLを入れる
396
+
397
+ post[:remote_image_url] = "" //remote_image_urlを空白に
398
+
399
+ @post = Post.new(post)
400
+
401
+ if @post.save
402
+
403
+ ...
404
+
405
+ end
406
+
407
+ end
408
+
409
+ ...
410
+
411
+ end
412
+
413
+ ```
414
+
415
+
416
+
417
+ しかし以上の方法では、image_nameが空白になってしまうようでバリデーションに引っかかります。
418
+
419
+ remote_image_urlをうまく渡せていないのが原因だと思うのですが、何かご指摘あればよろしくお願いいたします。
278
420
 
279
421
 
280
422