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

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

人生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に取りかかれそう。頑張ろう。
あ、認可モデルがまだできてない。そもそも設計って難しすぎないか?なにも作ったことないから、なにが必要なのかもわからず、一応書き出してはいるものの抜けが多い。