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