質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1774閲覧

Railsでmicropost自動保存(下書き保存)機能をつけたい

marutama_giant

総合スコア16

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/08/25 11:38

編集2017/08/26 15:01

RailsでRails / Ajaxを使って画面遷移しない一時保存機能をつけるをみながら、自動保存機能をつけたいと思っています。下書き保存を実装する際に、内容としてはまず、通常投稿にpublishedカラム(boolean)を追加し、投稿に「create_temp」という新しいアクションを付与します。それからjavascriptで5000ミリ秒ごと経過すると保存のアクションに入るというものかと思います。
まず、この通りに書いてみたのですが「下書き保存のための情報が足りません」と出るだけでうまく機能できていません。
エラーメッセージが見当たらず、てんてこ舞いです。
次に、この保存された下書きを出す方法がいまいち想像つきません。<% if @micropost.published.false %>してから配列させるということでしょうか。

該当するソースコード

_micropost_form.html.erb

Ruby

1<div class="micropost-form"> 2 <%= form_for(@micropost) do |f| %> 3 <%= render 'shared/error_messages', object: f.object %> 4 <div class="field"> 5 <!-- コメント --> 6 <%= f.text_area :content, placeholder: "Compose new micropost..." %><br /> 7 <!-- 一時保存 --> 8 <div class="create-temp"></div> 9 <%= f.submit "Post", class: "btn btn-primary" %> 10 <% end %> 11</div>

micropost_controller.rb

Ruby

1class MicropostsController < ApplicationController 2 before_action :logged_in_user, only: [:create, :destroy] 3 before_action :correct_user, only: :destroy 4 5 def create 6 @micropost = current_user.microposts.build(micropost_params) 7 @micropost.thumbnails.build 8 if @micropost.save 9 flash[:success] = "Micropost created!" 10 redirect_to root_url 11 else 12 @feed_items = [] 13 render 'sessions/new' 14 end 15 end 16 17 def destroy 18 @micropost.destroy 19 flash[:success] = "Micropost deleted" 20 redirect_to request.referrer || root_url 21 end 22 23 def create_temp 24 @micropost = current_user.microposts.build(micropost_params) 25 @misropost.published = false 26 @micropost.save 27 end 28 29 def update 30 @micropost.attributes = micropost_params 31 @micropost.published = true if params[:commit] 32 33 respond_to do |format| 34 format.js do 35 @micropost.save 36 end 37 format.html do 38 if @micropost.save 39 flash[:success] = "Micropost created!" 40 redirect_to @micropost 41 else 42 render 'edit' 43 end 44 end 45 end 46 end 47 48 private 49 50 def micropost_params 51 params.require(:micropost).permit(:content, :rate, :type, :case, :hour, :fee, :image, thumbnails_attributes: [:image]) 52 end 53 54 def correct_user 55 @micropost = current_user.microposts.find_by(id: params[:id]) 56 redirect_to root_url if @micropost.nil? 57 end 58end

config/routes.rb

Ruby

1 post 'microposts/temp', to: 'microposts#create_temp', as: :temp_micropost

assets/javascripts/draft.coffee

JavaScript

1# Place all the behaviors and hooks related to the matching controller here. 2# All this logic will automatically be available in application.js. 3# You can use CoffeeScript in this file: http://coffeescript.org/ 4ready = -> 5 # 断続的な保存機能 6 if $('.create-temp') 7 window.tempTimer = null 8 $('.micropost-form form').keydown -> 9 # リセット 10 window.clearTimeout(tempTimer) 11 window.tempTimer = window.setTimeout -> 12 tempSubmit() 13 , 5000 14 15tempSubmit = -> 16 # 作成 17 if $('.create-temp span').data('result') != true 18 $(".micropost-form").ajaxSubmit( 19 url: '/microposts/temp', 20 type: 'post' 21 ) 22 # 更新 23 else 24 $(".micropost-form form").ajaxSubmit() 25 26# For turbolinks 27$(document).ready(ready) 28$(document).on('page:load', ready)

JavaScript

1// 自動保存 2var result = '<%= @micropost.valid? %>'; 3var msg = ""; 4var notice = ""; 5 6if (result == true) { 7 msg = "Already saved!"; 8 // IDを付与する 9 $('.micropost-form').prepend('<input name="micropost[id]" type="hidden" value="<%= @micropost.id %>">'); 10 11 // RESTメソッドを変更する 12 $('.micropost-form input[name=_method]').remove(); 13 $('.micropost-form').prepend('<input name="_method" type="hidden" value="patch">'); 14 15 // URLを変更する 16 $('.micropost-form').attr('action', '/microposts/<%= @micropost.id %>'); 17 18} else { 19 msg = "Couldn't save!"; 20} 21 22// メッセージ 23notice = "<span data-result=" + result + ">" + msg + "</span>"; 24$('.create-temp span').remove(); 25$('.create-temp').hide().append(notice).fadeIn();

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h_daido

2017/09/05 13:38

いくつかデバッグのフェーズを踏んだほうがいいと思います。①まずは、ちゃんとcreate_testアクションが呼ばれているか?②次にDBに反映されているか?(create_testによってレコードが増えているか)③jsファイル内の各変数のデバッグ。特にvar resultに値がちゃんとはいっているか。 デバッグの仕方がわからなければコメントください。
marutama_giant

2017/09/10 01:26

いただいた内容でデバックを進めて行きたいと思います。ご丁寧にありがとうございます
guest

回答2

0

ベストアンサー

js.erbって確かあくまでerbファイルだからシングルクォートだと文字列として処理された気がします。
実際にコード実行していないのでまだ検証できていませんが・・・

ruby

1var result = '<%= @micropost.valid? %>'; #result = '<%= @micropost.valid? %>'

ruby

1var result = "<%= @micropost.valid? %>"; #result = true or false

投稿2017/09/12 11:42

ys3128

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

すいません、ちゃんとコードで確認したわけではないのですが、js.erbのファイルにて、

js

1var result = '<%= @micropost.valid? %>';

としていますが、

js

1var result = <%= @micropost.valid? %>;

ではないでしょうか?
''内が文字列で展開されてしまっているので、

js

1if (result == true) {

が通らなくなっているのではないでしょうか?
その結果、elseブロックが実行されていると思います。

私もコードにて確認したいと思います。

投稿2017/09/07 06:02

naoki855

総合スコア75

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marutama_giant

2017/09/10 01:26

tonnyさん、ありがとうございます。連絡が遅れてしまいすみませんでした。シングルクォーターをとってみたのですが、できませんでした。もう少し自分でやり直してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問