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

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

ただいまの
回答率

87.59%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,275

score 16

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

 該当するソースコード

_micropost_form.html.erb

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

micropost_controller.rb

class MicropostsController < ApplicationController
  before_action :logged_in_user, only: [:create, :destroy]
  before_action :correct_user,   only: :destroy

  def create
    @micropost = current_user.microposts.build(micropost_params)
    @micropost.thumbnails.build
    if @micropost.save
      flash[:success] = "Micropost created!"
      redirect_to root_url
    else
      @feed_items = []
      render 'sessions/new'
    end
  end

  def destroy
    @micropost.destroy
    flash[:success] = "Micropost deleted"
    redirect_to request.referrer || root_url
  end

  def create_temp
    @micropost = current_user.microposts.build(micropost_params)
    @misropost.published = false
    @micropost.save
  end

  def update
    @micropost.attributes = micropost_params
    @micropost.published = true if params[:commit]

    respond_to do |format|
      format.js do
        @micropost.save
      end
      format.html do
        if @micropost.save
          flash[:success] = "Micropost created!"
          redirect_to @micropost
        else
          render 'edit'
        end
      end
    end
  end

  private

  def micropost_params
    params.require(:micropost).permit(:content, :rate, :type, :case, :hour, :fee, :image, thumbnails_attributes: [:image])
  end

  def correct_user
    @micropost = current_user.microposts.find_by(id: params[:id])
    redirect_to root_url if @micropost.nil?
  end
end


config/routes.rb

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

assets/javascripts/draft.coffee

# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://coffeescript.org/
ready = ->
    # 断続的な保存機能
    if $('.create-temp')
        window.tempTimer = null
        $('.micropost-form form').keydown ->
            # リセット
            window.clearTimeout(tempTimer)
            window.tempTimer = window.setTimeout ->
                tempSubmit()
            , 5000

tempSubmit = ->
    # 作成
    if $('.create-temp span').data('result') != true
        $(".micropost-form").ajaxSubmit(
            url: '/microposts/temp',
            type: 'post'
        )
    # 更新
    else
        $(".micropost-form form").ajaxSubmit()

# For turbolinks
$(document).ready(ready)
$(document).on('page:load', ready)
// 自動保存
var result = '<%= @micropost.valid? %>';
var msg = "";
var notice = "";

if (result == true) {
    msg = "Already saved!";
    // IDを付与する
    $('.micropost-form').prepend('<input name="micropost[id]" type="hidden" value="<%= @micropost.id %>">');

    // RESTメソッドを変更する
    $('.micropost-form input[name=_method]').remove();
    $('.micropost-form').prepend('<input name="_method" type="hidden" value="patch">');

    // URLを変更する
    $('.micropost-form').attr('action', '/microposts/<%= @micropost.id %>');

} else {
    msg = "Couldn't save!";
}

// メッセージ
notice = "<span data-result=" + result + ">" + msg + "</span>";
$('.create-temp span').remove();
$('.create-temp').hide().append(notice).fadeIn();
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • h_daido

    2017/09/05 22:38

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

    キャンセル

  • marutama_giant

    2017/09/10 10:26

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

    キャンセル

回答 2

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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


としていますが、

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


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

if (result == true) {


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/10 10:26

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

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る