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();
回答2件
あなたの回答
tips
プレビュー