Help us understand the problem. What is going on with this article?

連日格闘したform_withとの戦いに決着をつけてきた

ここ数日間、Rubyで作ってきたアプリ内のform_tagを、form_withに変えてみよーっとしてたんですが、思いの外時間がかかり苦戦したので、記録しておきます。
特に編集ページで画像を添付して反映させるという流れで詰まったので、その点について後半で触れます。

そもそも何でform_withを使うのか?

form_withで書きたいなーと思っていた理由は以下の2点です。どうでもいいわーと言う方は読み飛ばしてください

  • 理由①:ActiveStorageを使いたくて、こちらを参考にしていたところ、form_with を使った方が良さげ
  • 理由②:form_tagform_forなどは非推奨となり、form_forへの完全置き換えも予定されているらしい

最近買った現場で使えるRuby on Railsなどでも、form_withの方が使われていたので、とりあえず現時点で勉強すべきはform_withっぽい

前提知識:Active Storageについて

ActiveStorageについては、こちらが非常に詳しいです。

$ rails active_storage:install
$ rails db:migrate
class User < ApplicationRecord
  has_one_attached :image #画像を一枚添付できるようにする
end

新規登録からユーザー画像を添付できるようにする

users_controller.rb
def new
  @user = User.new
end

def create
    @user = User.new(user_params)
        if @user.save
        session[:user_id] = @user.id
        flash[:notice] = "ユーザー登録が完了しました"
        redirect_to('/posts/index')
    else
        render("/users/new")
    end
end

def user_params
    params.require(:user).permit(:name,:email,:password,:image) #ここがポイント
end

new.html.erb
<%= form_with model: @user, url: users_path,local: true do |form| %>
  <%= form.label :name, 'ユーザー名' %>
  <%= form.text_field :name %>
  <%= form.label :email, 'メールアドレス' %>
  <%= form.text_field :email %>
  <%= form.label :image, 'プロフィール画像' %>
  <%= form.file_field :image %>
  <%= form.label :password, 'パスワード' %>
  <%= form.password_field :password %>
  <%= form.submit "新規登録" %>
<% end %>

上記のcontroller内で、imageをpermitしてあげるところがポイントというか、僕はここの記述が抜けていてエラーが出まくると言う感じでした。

上記の通りに記述すれば、以下で出力が可能です。

show.html.erb
<% if @user.image.attached? %>
    <%= image_tag @user.image %>
<% end %>

編集画面から画像を添付できるようにする

編集画面から画像を添付する実装ですが、以下の通りです。

edit.html.erb
<%= form_with(model: @user, local: true) do |form| %>
  <%= form.label :name, 'ユーザー名' %>
  <%= form.text_field :name %>
  <%= form.label :email, 'メールアドレス' %>
  <%= form.text_field :email %>
  <%= form.label :image, 'プロフィール画像' %>
  <%= form.file_field :image %>
  <%= form.label :password, 'パスワード' %>
  <%= form.password_field :password %>
  <%= form.submit "編集" %>
<% end %>

基本的にはこれだけでいけるんですが、何で詰まっていたかというと、ルーティングで以下のような指定をしていて、form_withでエラー出まくっていたと言うわけです。

routes.rb
  post 'users/:id' => 'users#update'
  get 'users/:id/edit' => 'users#edit'

routes.rb
 resouse :users

最初からこう書いておけばよかったわけなんですが、、、

そんなわけで本日は以上です。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away