質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

486閲覧

form_tagをform_withに変えると値が保存されなくなった

punchan36

総合スコア105

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2020/04/12 14:08

前提・実現したいこと

これまでform_tagで書いていたユーザーのプロフィールページをform_withに書き換えていたところ、値が保存されなくなりました。赤字のエラーメッセージは表示されませんが、空欄のままの保存を防ぐために個人的に設定していたエラーメッセージ(Name can't be blank、Email can't be blank等)が表示されます。フォームにきちんと入力してもこの文言が出てしまうのですが、なぜコントローラーが項目を受け取ってくれなくなったのかが分かりません。

該当のソースコード(users/edit.html.erb)

rails

1 <div class="form-body"> 2 <% @user.errors.full_messages.each do |message| %> 3 <div class="form-error"> 4 <%= message %> 5 </div> 6 <% end %> 7 <%= form_with(model: User, local: true) do |f| %> 8 <p> 9 <%= f.label :ユーザー名 %> 10 <%= f.text_field :name, value: @user.name %> 11 </p> 12 <p> 13 <%= f.label :画像 %> 14 <%= f.file_field :image, value: @user.image_name %> 15 </p> 16 <p> 17 <%= f.label :カバー画像 %> 18 <%= f.file_field :cover_image %> 19 </p> 20 <p> 21 <%= f.label :メールアドレス %> 22 <%= f.email_field :email, value: @user.email %> 23 </p> 24 <p> 25 <%= f.label :性別 %> 26 <%= f.radio_button :sex, :Male %>男 27 <%= f.radio_button :sex, :Female %>女 28 </p> 29 <p> 30 <%= f.label :国籍 %> 31 <%= f.country_select :country, selected: @user.country %> 32 </p> 33 <p> 34 <%= f.label :言語 %> 35 <%= f.select(:language, options_for_select(languages)) %> 36 </p> 37 <p> 38 <%= f.label :自己紹介 %> 39 <%= f.text_area :introduction, rows: "10", cols: "100", value: @user.introduction %> 40 </p> 41 <%= f.submit "保存" %> 42 <% end %> 43 </div>

該当のソースコード(users_controller.rb)

Ruby

1class UsersController < ApplicationController 2 before_action :authenticate_user, {only: [:index, :show, :edit, :update]} 3 before_action :forbid_login_user, {only: [:new, :create, :login_form, :login]} 4 before_action :ensure_correct_user, {only: [:edit, :update]} 5 6def edit 7 @user = User.find_by(id: params[:id]) 8 end 9 10 def user_params 11 params.require(:user).permit(:name, :description, languages_attributes: [:id, :description, :done, :_destroy]) 12 end 13 14 def update 15 @user = User.find_by(id: params[:id]) 16 @user.name = params[:name] 17 @user.email = params[:email] 18 @user.sex = params[:sex] 19 @user.country = params[:country] 20 @user.language = params[:language] 21 @user.introduction = params[:introduction] 22 if params[:image] 23 @user.image_name = "#{@user.id}.jpg" 24 image = params[:image] 25 File.binwrite("public/user_images/#{@user.image_name}", image.read) 26 end 27 if params[:cover_image] 28 @user.cover_image_name = "#{@user.id}_cover.jpg" 29 cover_image = params[:cover_image] 30 File.binwrite("public/user_cover_images/#{@user.cover_image_name}", cover_image.read) 31 end 32 if @user.save 33 flash[:notice] = "ユーザー情報を編集しました" 34 redirect_to("/users/#{@user.id}") 35 else 36 render("users/edit") 37 end 38 end

試したこと

form_with関連のページを参照し、フォームの実装までは上手く漕ぎつけたのですが、保存の部分で行き詰まってしまいました, ,
「form_with コントローラー」や「form_with 保存」等で情報を得ようとしたのですが、原因が見つかりませんでしたので質問させて頂きました。

補足情報(FW/ツールのバージョンなど)

ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

うーん、現状の問題を解決しただけではセキュリティなどに問題がありそうで回答が難しいですね。

Deviseとかの認証はひとまず気にせず、勉強用のアプリを一つ作ることをおすすめします。
コマンドで

rails new scaffold-app#新しいアプリを作る
rails g scaffold user name:string email:string sex:integer country:integer language:integer introduction:text#同じ構成で作る(画像は除いています)
rails db:migratge#DBを構築
rails s#アプリ実行

これでできたファイルたちが、form_withやcontrollerの適切な書き方となり、それぞれの意味が下記となります。
http://kanjihtmt.github.io/blog/2015/04/02/scaffold/

個人的には、一度立ち止まってみるほうがあとあと良い結果になるかと思います。

投稿2020/04/12 16:16

no1knows

総合スコア3365

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

punchan36

2020/04/18 13:57

有難うございます。ご回答頂いた方法で見てみると課題も見付かりました。 ただ解決までには時間がかかりそうなので一旦ベストアンサーとさせて頂き、解決方法が分かり次第追記をしようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問