体重133キロからのプログラミング

体重はちょっと減って今125キロです。

人生58日目

HAGIRE(4)

今日はあんまり進んでない。
というのも、昨日間違ったまま実装していたコードをお世話していたからだ。
記事は修正したので大丈夫だと思うけど、これの解決に3時間くらい使って虚無だった。
あと、credentialに認証情報をいれているのにGitHubがopenになっていたため、AWSのS3が凍結されてしまった。
一応手続きはして、返信待ち。治るといいなあ。

人生57日目

HAGIRE(3)

今日はdeviseとActive Storageにいじめられた。

privateメソッドのテスト

「send」メソッドを使う。

equire 'test_helper'

class UserTest < ActiveSupport::TestCase
  def setup
    @maehara = users(:maehara)
    @konishi = users(:konishi)
  end

  test "followとunfollowの動作確認" do
    assert_not @maehara.send(:following?, @konishi)
    @maehara.send(:follow, @konishi)
    assert @maehara.send(:following?, @konishi)

    @maehara.send(:unfollow, @konishi)
    assert_not @maehara.send(:following?, @konishi)
  end
end

deviseがあるとuserモデル下が全部privateになるっぽかった。
follow機能のテストもかけたし、Railsチュートリアルでsendの存在を知っててよかった。

ActiveStorageでattached?がfalseになる(2019年9月14日追記)

画像自体はハッシュ化されてるのに何でだろうと思ってたら解決した。と思ったらしてなかった。

class BuriburipostsController < ApplicationController
  def create
    @buriburipost = current_user.buriburiposts.build(buriburipost_params)
#このままだと画像なしで投稿するとエラーになる
    @buriburipost.pictures.attach(params[:buriburipost][:pictures])
    if @buriburipost.save
      flash[:success] = "投稿しました!"
      redirect_to root_url
    else
      render "static_pages/home"
    end
  end

以下のようにするとうまくいく。

def create
    @buriburipost = current_user.buriburiposts.build(buriburipost_params)
    if pictures = params[:buriburipost][:pictures]
      @buriburipost.pictures.attach(pictures)
      @buriburipost.save
      flash[:success] = '投稿しました!'
      redirect_to root_url
    elsif @buriburipost.save
      flash[:success] = '投稿しました!'
      redirect_to root_url
    else
      render 'static_pages/home'
    end
  end

最初のコードだと、picturesが必ずattachされてしまうので、例えばビューで

<% if post.pictures.attaced? %>
<%= image_tag post.pictures %>
<% end %>

のようにしている場合でも条件式がtrueになって、image_tagのリンクが空のため例外が発生する。
「attachする=画像が存在している」っていうことらしい。
「画像アップロードしなければpicturesはnilだし関連付けされない」と思っていたけど、「pictures」には「関連付けされているかどうかを確認するための情報」が入っているため、nilにはならない。
そのため、if @buriburipost.pictures.nil?のようにして条件分岐ができない。(ここで3時間くらいハマった)
「Active Storageで指定したカラムは毎回関連付けされるため空にならない。」ということっぽい。
そこで、if pictures = params[:buriburipost][:pictures]として、picturesの中身とフォームの送信情報を比較して、一致していればattachする、一致しない場合はそのままsaveするようにしたら期待通りに動いた。

しかもこれ最初に読んでたQiitaに親切にも書いてくれてた。ほんと恥ずかしい。
【Rails 5.2】 Active Storageの使い方 - Qiita

f:id:poinorou:20190914001543p:plain 要素の配置も終わってきたので、あと機能を1つ追加すればHTMLとCSSに取りかかれそう。頑張ろう。
あ、認可モデルがまだできてない。そもそも設計って難しすぎないか?なにも作ったことないから、なにが必要なのかもわからず、一応書き出してはいるものの抜けが多い。

人生56日目

HAGIRE(2)

Buriburipost modelを作成。アソシエートも問題なし。
CarrierWaveで画像アップロードを試そうとしたが、ActiveStorageとかいうものがあったのでせっかくなので使ってみた。
外部ライブラリ使わずにアップロードできるってすごいなあ。
紆余曲折を経てAWSのS3にアップロードできるようになった。
f:id:poinorou:20190913004753p:plain

今日お世話になったサイト

いつも忘れる「Railsのgenerateコマンド」の備忘録 - maeharinの日記 deviseで作成したUserモデルにusernameカラムを追加してDBへ登録できるようにする - Qiita 【Rails 5.2】 Active Storageの使い方 - Qiita 【Rails】Herokuで画像を投稿できるようにする方法(ActiveStorage + Amazon S3) - Qiita git add - Gitコマンド | WWWクリエイターズ

人生55日目

HAGIRE.(1)

f:id:poinorou:20190912005835p:plain

静的ページを作ってdevice gemを導入した。
これ頭おかしいよ強力すぎる。
一瞬でログイン機能を実装してしまった。
強力すぎて内部がどうなっているかわからないので、好きなように弄りにくいのが難点。
特にflashメッセージのコントロールが普通にはできないため、常にページ上部に余白が発生してしまう。
なので、一旦諦めてエラーメッセージなどは自分で定義したものを使うことにした。 あと、強力すぎるのでまずはdeviseを導入してから他の部分作るべきですね。
名前つきルートもチュートリアルとはずいぶん違ってしまうようなので、$ rails routesしながら確認していこう。

Bootstrap

これも便利すぎる。最初はフルスクラッチで書いてたからなあ。
だんだん慣れてきて、仕組みがわかってきた。
グリッドレイアウトは以前サイトを作った時に触っていたので、Bootstrapのグリッドの使い方も分かって楽しい。
特にこちらはheightを自動調節してくれたり、要素と要素の隙間をいい感じに取ってくれるので強い。
画像に緑の枠があるのは、containerクラスがわかりやすいように、borderを指定しているためです。
本文が決まってない部分にはクラス名を入れて、動きがわかりやすいようにしてます。
containerのなかの要素は、

<div class="container">
    <div class="row">

      <div class="col-xs-6 col-lg-4">
        <div class="box">
          <p>
            健康な人のうんちは80%が水分で、残る20%のうち3分の1が食べカス、3分の1が生きた腸内細菌、3分の1が剥がれた腸粘膜です。
            <br>
            だから、うんちを見れば健康状態がわかる。
            <br>
            自分の出したうんちがどうだったか確認しましょう。
          </p>
        </div>
      </div>

      <div class="col-xs-6 col-lg-4">
        <div class="box">col-xs-6 col-lg-4</div>
      </div>
  
      <div class="col-xs-12 col-lg-4">
        <div class="box">col-xs-12 col-lg-4</div>
      </div>

    </div>
</div>

このようにカラムを指定しているクラスの中にboxクラスを作って、そこにborderを適用することで各要素の大きさがわかります。(茶色い枠のこと) 自分で書くのって本当に楽しい!

早速Gitでやらかす

git cleanしたら必要なものまで消えちゃって作り直す羽目になった。マジで気をつけよう・・・。

まとめ

Git気をつける
Bootstrapすごい
Devise怖い

HAGIRE.(定期更新)

HAGIREとは

「うんちの歯ぎれ報告サイト」
排便から、健康を考えるきっかけを作る。

動機

うんちのこと真面目に考えたことなかったので。(快食快便)

機能(実装予定)

  • 投稿機能
    短い文章を投稿できる。ツイートみたいなもの。
  • フォロー機能
    ユーザーをフォローすることで自分の投稿一覧にフォローしたユーザーの投稿を表示。
  • HAGIRE機能
    投稿に歯ぎれ具合を含めることができる。
    HAGIREアイコンをクリックして選択する。
    選択したHAGIREアイコンに応じて、投稿の背景が変わる。
  • HAGIRE一覧機能
    HAGIREアイコンそれぞれにカラーを設定し、確認できる。
    Gitのコミットすると緑が付くやつみたいなのを実装したい。

データモデル

user
id name email password-digest image activate activated_at activation-digest reset-digest
int str str str str boolean datetime str str
buriburipost
id user_id content picture hagire
int int text str int
Relationship
following_id followed_id
int int

HAGIRE機能の実装方法

HTML(erb)内でif文使って分岐?
となるとHAGIREアイコンの数*3行ほどコードが長くなるのでスマートじゃない気がする。
要検討。

いしゅー

何か問題が起きたらここに記す

人生54日目

ポートフォリオ作成

今日からようやく始めることができたが、早速bootstrapに泣かされている。
便利なものを便利に使うためには知識がどうしても必要になる。しんどいなあ。
データモデルも固まってるので、明日詳しい内容を載せます。今日から開発日記や!

人生53日目

Railsチュートリアル(14)2週目

完走した。なんか泣けそうになる。寂しさもある。
でもきっとまた読むことになる。これからもよろしくな!!!!!

これから

まずはTwitterライクということもあってとっつきやすいと思うので「うんちの歯切れ報告サイト」を一から作り直します。
完成したら次は「宿題作成サイト」を作ります。
一作目のポートフォリオが完成したタイミングから就活も開始します。雇ってくれえ・・・。