アラフォーがお金持ちになるためプログラマ目指すブログ

お金も根性も学歴もないアラフォーまきのがエンジニア…じゃない、プログラマになってお金持ち目指すよ!

【Railsメモ】Active Storageで複数画像OKにしてたのを1枚だけに変更する

0:やりたかったこと


私の力不足で、複数の画像を追加できるようにした時のレイアウトがどうあがいてもウンコだったので、ここは素直に1記事1枚にしようと決意にも似た諦めに到達しました。



なお、いっちゃん最初の導入はこちらが丁寧でとても参考になりました。
その節はどうもありがとうございました。

qiita.com



っていうか、ほぼ複数形を単数形にするだけの作業だし、正直↑の記事みたらかたづくんでないか。



この記事いらないかもw

1:まずはmodelの修正


【旧】

has_many_attached :images


【新】

has_many_attached :images

複数形を単数形にするだけでOK

2:controllerの修正(2箇所)


①ストロングパラメータの修正


【旧】

private

def work_params
 params.require(:work).permit(:memo, :title, :images, :user_id, :do_moku_id, :memo_public, :pickup_public)
end


【新】

private

def work_params
 params.require(:work).permit(:memo, :title, :image, :user_id, :do_moku_id, :memo_public, :pickup_public)
end

ここも複数形を単数形に。:images:imageにするだけ


②画像削除部分の修正

【旧】

def delete_image
  work = Work.find(params[:id])
  image = work.images.find params[:image_id]
  image.purge

  redirect_to("/users/#{current_user.id}/works/#{work.id}")
end


【新】

def delete_image
  work = Work.find(params[:id])
  work.image.purge

  redirect_to("/users/#{current_user.id}/works/#{work.id}")
end

1つのworkに複数画像が貼れるので、削除対象のidの画像だけ拾ってきてimageに代入する作業が必要だった。




それがimage = work.images.find params[:image_id]の部分。




で、対象画像idの入ったimageに対し.purgeメソッドをさせて、画像を削除してもらってた。





でも画像は1枚しかない状態に変更するので、探しにいかなくてよくなった。



だから代入とか余計なことせずにwork.image.purgeでOK


3:viewの修正(箇所)


①new.html.erb


【旧】

<%= bootstrap_form_with(model: @work,
      url: {controller: :works, action: :create, user_id: @user.id, moku_id: @do_moku.id},
      method: :post,
      local: true) do |form| %>

<h3>画像の追加</h3>
<%= form.file_field :images, hide_label: true, multipart: true %>


【新】

<%= bootstrap_form_with(model: @work,
      url: {controller: :works, action: :create, user_id: @user.id, moku_id: @do_moku.id},
      method: :post,
      local: true) do |form| %>
:
<h3>画像の追加</h3>
<%= form.file_field :image, hide_label: true, multipart: true %>
:


new.html.erbは、文字通り新しく記事を登録するフォームのあるページ。
form_with(実際にはbootstra_form_with使ってるけど)でDBに飛ばしてる


それでもまあやることは変わらず複数形を単数形にするだけ。



②show.html.erb


【旧】

<% if @work.images.attached? %>
 <% @work.images.each do |image|  %>
  <%= image_tag @work.image.variant(resize: '300x') %>
 <% end %>
<% else %>
 <h5>画像の登録はありませんでした</h5>
<% end %>


【新】

<% if @work.image.attached? %>
 <%= image_tag @work.image.variant(resize: '300x') %>
<% else %>
 <h5>画像の登録はありませんでした</h5>
<% end %>


showはその名の通り、newで登録したデーターの閲覧ページ。
単数形に直すことと、1枚でよくなったので、eachでgrgrする必要がなくなったのでその分削除。すっきり。



③edit.html.erb


【旧】

<% if @work.images.attached? %>
 <% @work.images.each do |image| %>
  <%= link_to "/works/#{@work.id}/images/#{image.id}", method: :delete, data: {confirm: "削除してよろしいですか?"}  %>
 <% end %>
 <%= image_tag image.variant(resize: '150x') %>&emsp;
<% end %>


【新】

<% if @work.image.attached? %>
 <%= link_to "/works/#{@work.id}/images/#{@work.image.id}", method: :delete, data: {confirm: "削除してよろしいですか?"}  %>
 <%= image_tag image.variant(resize: '150x') %>&emsp;
<% end %>
:


editはその名の通り編集ページ。
newと一緒で、form_withでDBに飛ばすけど、そのコードあると見辛いし特に関係ないので割愛。



ここも単数形に直すのと、link_toのデータ送り先の書き方を変更。

/works/#{@work.id}/images/#{image.id}"だったのを
/works/#{@work.id}/images/#{@work.image.id}"へ。



eachでgrgrしなくなったから。




以上。





…この記事いらなくない?まあいいか。