yujiroのプログラミング

勉強内容をアウトプットし、サボらないようにする為のブログ

<DAY111>マイグレーションファイルにファイルを追加するには?

UPされたマイグレーションファイルをうっかり消してしまった場合

初歩的だが、少し困ったなので、アウトプットする。

rake db:migrate:status

にて状況を確認すると、マイグレーションファイルはUPされているが、
NODATEの状態であった。
マイグレーションファイルをdownの状態にさせて削除するにはどうするか確認した。

手順1 ダミーのマイグレーションファイルを生成する。

UPされているマイグレーションファイルのナンバーを確認。
ナンバーに応じてファイル名を記入

'20190517143914_tmp.rb'

ファイルには空の内容を記載する

class Tmp < ActiveReocrd::Migration

def cange
end

end

これをすると、ファイルを認識する事ができる。

手順2 version指定してdownさせる

指定してdownさせると手違いがない。

bundle exec rakedb:migrate:down VERSION=20190517143914

参考文献

joppot.info


外部キーを追加する手順

migrateファイルを作成

rails g migrate AddColumnHogeId

外部キーを追加する時に、オプションはセット。idは加えないがポイント

class AddColumnHogeId < ActiveReocrd::Migration[5.2]

  def change
    add_reference :TableName, :gaibukey, foreign_key: true
  end

end

親要素が削除された子要素もひもづき削除するオプション

validates設定時に使用する。

belongs_to :hoge, dependent: :destory

参考文献

関連づけを使用する場合を参照

railsguides.jp

<DAY110> エラーハンドリングについて

学習状況

●学習日数 110日

●学習時間(本日)10時間
●累計学習時間 527.5時間

●一日あたりの平均学習時間 4.79時間

エラーハンドリングとは?

エラー発生時に、エラー発生原因を特定しやすくする。
エラー発生時にエラー発生で処理を止めるのでなく、
エラー発生時を想定し処理を記述する事で、ユーザーの使い勝手を高める

エラーをキャッチしたい範囲を決める。

エラーを取得したい範囲を
'begin~~~end'にて囲む

例えば、

class ItemsController < ApplicationController 
 begin
   def create
   create(params_create)
  end
 end
end

private
params.require(:item).permit(:name)

エラー時に処理したい記述をrescue~~に記述する。

class ItemsController < ApplicationController 
 begin
   def create
   create(params_create)
  rescue ActiveRecord :: RecordInvalid => e
 @item = e.record
 render :action => 'new'
  end
 end

DRYに記述するには?


createだけでなく、update,
destroyにも必要で同じ処理を記入するとDRYでは無くなります。
そのため、コントローラー全体に範囲を適用する'rescue from'を使用します。

class ItemsController < AplicationController

rescue from ActiveRecord::RecordInvalia do |exseption|

end

<DAY108>JQUeryを使用したmarkdownフォーム生成アクション

学習状況

●学習日数 109日

●学習時間(本日)10時間
●累計学習時間 512.5時間

●一日あたりの平均学習時間 4.69時間

form for のクラス名の指定

曖昧だった。
:にて指定する。bootstraps使用時に確認。

<%= f.submit class:"aaaa"%>

入力されたformをjsで反映

入力された文字をmarkdown方式で出力。
シンタックスハイライト対応はイメージができなかったので、
とりあえず簡単にできそうなmarkdownに対応できるようにした。

f:id:yujiro0320:20190607212605p:plain


対象viewの変更

app/views/answers/new
表示したいhtmlの親セレクタにidを指定した。

    <div class= "col-xs-6 col-lg-6" id="form-text">

gemのredcarpetにて生成されるhtml部分をchangeを発火にして
出力するようにする。ただ、これだと、change発火の度にフォームが生成されてしまう。
フォームは一度だけ生成して、テキストの中身だけを変更するようにしたい。
イメージは掴めたので明日の朝一する。
app/assets/javascripts/form.jsを作成

$(function() {
      function appendHtml(input){
      var html =  `<div class="highlight" id="size-fix">
                    <pre class="highlight plaintext">
                      <code>
                        ${input}
                        </code>
                    </pre>
                  </div>
                  `
                  $("#form-text").append(html)
                }
    $("#answer_content").on('change', function(e){
      e.preventDefault();   
      inputText = $("#answer_content").val();
      appendHtml(inputText)
  })
}) 

fromについて問題点

表示される文字に行間がついている
シンタックスハイライトに対応できていない
シンタックスハイライトの場合クラス名やhtmlの構成要素が都度変わる為、
複雑な処理となる。

<DAY107>学習忘備録

学習状況

●学習日数 107日

●学習時間(本日)7時間
●累計学習時間 502.5時間

●一日あたりの平均学習時間 4.69時間





リロードしたらエラーが解消する件について

症状

送信ボタンが反応せず、リクエストが送信されない。
リロードしたら解消するエラー

原因

Turbolinksの挙動によるエラー
gemから削除する

Turbolinks
javascripts/application.js
turubolinkの読み込みを解消させる

最後に

挙動について詳しく確認ができていない。
ソースコードを見るかもしくは、記事を検索して
理解に努める。

効果確認したメソッド

text()メソッド

text("aaaa")
()内の情報を取得する

val()メソッド

セレクタvalue属性を取得する
セレクタvalueがない場合、valueを生成しval("aa")を生成する。

他イベント。

qiita.com


アセットパイプラインとは

js読み込み順に問題

//= require activestorage
//= require jquery
//= require_tree .
//= require rails-ujs

require treeよりjqueryを上に持ってこないと
うまく認識しなかった。

理解度

ここもなぜこうなるのかの理解が必要。
時間を見つけて確認する。

<DAY106> bootstrapにてデザインとレスポンシブ対応

*学習状況

●学習日数 106日

●学習時間(本日)7時間 ●累計学習時間 495.5時間

●一日あたりの平均学習時間 4.67時間

*bootstrapにて実装

メモするより都度調べて実装していた。 アウトプットしていなかった。 次また本格的に実装するときにまとめる。

<DAY105>アプリ制作RESTな設定について

f:id:yujiro0320:20190512223713p:plain

学習状況

●学習日数 105日

●学習時間(本日)10.5時間
●累計学習時間 488.5時間

●一日あたりの平均学習時間 4.65時間

フォームに入力した回答を別モデルに保存するページを作成する

どのような構成を検討していたか?

(1)tweets#indexアクション(問題のタイトルを一覧で表示)
(2)tweets#showアクション(問題の詳細をみる)
(3)tweets#showアクション(問題を確認しフォームに回答を入力)
(4)入力されたフォームを別のリソースであるanswer#createに飛ばしモデルオブジェクトを保存


ハマっていた理由

form forを使用していたが、保存するモデルが変わる。モデルオブジェクトをうまくはめ込めず。
できるだろうが、今は製作物を仕上げるのが優先なので、方法を変更した。

成功した構成

(1)tweets#indexアクション(問題のタイトルを一覧で表示)
(2)tweets#showアクション(問題の詳細をみる)
(3)tweets#showアクション(問題を確認)
(4)tweets#showアクション(link_toを使用し、answernewアクションに飛ばす)
(5)answers#newアクション(answerインタスタンスを生成)
(6)answers#createアクション(Anserモデルを用いてDBにデーターを保存)
(7)answers#show(保存されたデーターの出力)

解決策

他気づいた事

基本、rails g controllerを使った方がいいと思った。
命名規則にうるさいので、ファイル名の誤字など防げるから。
必要ないファイルを削除する必要あるけど。

最後に

こんな簡単な事もテキストの誘導ないと詰まってしまうが、
もうこんな事でつまる事はないので、少し成長した。