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

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

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

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

Ruby on Rails 6

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

解決済

ユーザー情報を編集する際のノーメッドエラーを解決したい

AKIRA0310
AKIRA0310

総合スコア15

Ruby

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

Ruby on Rails 6

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

2回答

0評価

0クリップ

248閲覧

投稿2022/04/26 15:37

編集2022/04/30 14:29

前提・実現したいこと

ユーザー情報の編集機能を実装しているのですが、updateのところでエラーが出てしまい躓いています。

該当のソースコード

users_controller.rb

ruby

def show @user = User.find(params[:id]) @currentUserEntry = Entry.where(user_id: current_user.id) @userEntry = Entry.where(user_id: @user.id) unless @user.id == current_user.id @currentUserEntry.each do |cu| @userEntry.each do |u| if cu.room_id == u.room_id @isRoom = true @roomId = cu.room_id end end end unless @isRoom @room = Room.new @entry = Entry.new end end end def edit end def update @user.update(user_params) if @user.save redirect_to user_path(@user.id) else render :edit end end private def user_params params.require(:user).permit(:image, :image_cache, :email, :password, :password_confirmation, :nickname, :comment, :content, :twitter, :instagram).merge(user_id: current_user.id) end

application_controller.rb

ruby

before_action :configure_permitted_parameters, if: :devise_controller? before_action :basic_auth private def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :comment, :content, :twitter, :instagram, :image, :image_cache]) devise_parameter_sanitizer.permit(:account_update, keys: [:nickname, :comment, :content, :twitter, :instagram, :image, :image_cache]) end

registrations_controller.rb

ruby

protected def update_resource(resource, params) resource.update_without_current_password(params) resource.image.attach(account_update_params[:image]) end def after_update_path_for(resource) user_path(@user.id) end

edit.html.erb

ruby

<%= form_with model: @user, url: edit_user_registration_path, class: 'registration-main', local: true do |f| %> <div class='form-wrap'> <div class='form-header'> <h1 class='form-header-text'> ユーザー情報入力 </h1> </div> <%= render 'shared/error_messages', model: f.object %> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">ニックネーム</label> <span class="indispensable">必須</span> </div> <%= f.text_area :nickname, class:"input-default", id:"nickname", maxlength:"40" %> </div> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">メールアドレス</label> <span class="indispensable">必須</span> </div> <%= f.email_field :email, class:"input-default", id:"email", placeholder:"PC・携帯どちらでも可", autofocus: true %> </div> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">パスワード</label> <span class="indispensable">必須</span> </div> <%= f.password_field :password, class:"input-default", id:"password", placeholder:"6文字以上の半角英数字" %> <p class='info-text'>※英字と数字の両方を含めて設定してください</p> </div> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">パスワード(確認)</label> <span class="indispensable">必須</span> </div> <%= f.password_field :password_confirmation, class:"input-default", id:"password-confirmation", placeholder:"同じパスワードを入力して下さい" %> </div> <div class="img-upload"> <div class="click-upload"> <p> クリックして画像をアップロード </p> <%= f.file_field :image, id:"item-image" %> <%= f.hidden_field :image_cache %> </div> </div> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">固定コメント</label> </div> <%= f.text_area :comment, class:"input-default", id:"comment", maxlength:"40" %> </div> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">自由記載欄</label> </div> <%= f.text_field :content, class:"input-default", id:"content", placeholder:"コメント・自己紹介など" %> </div> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">SNSアカウント登録</label> </div> <%= image_tag "twitter.png", class: :twitter_icon %> <%= f.text_field :twitter, class:"input-default", id:"twitter", placeholder:"URLを入力してください" %> <%= image_tag "instagram.png", class: :instagram_icon %> <%= f.text_field :instagram, class:"input-default", id:"instagram", placeholder:"URLを入力してください" %> </div> <div class='register-btn'> <%= f.submit "登録" ,class:"register-red-btn" %> </div> </div> <% end %>

schema.rb

ruby

ActiveRecord::Schema.define(version: 2022_04_25_062328) do create_table "active_storage_attachments", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "name", null: false t.string "record_type", null: false t.bigint "record_id", null: false t.bigint "blob_id", null: false t.datetime "created_at", null: false t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id" t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true end create_table "active_storage_blobs", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "key", null: false t.string "filename", null: false t.string "content_type" t.text "metadata" t.bigint "byte_size", null: false t.string "checksum", null: false t.datetime "created_at", null: false t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true end create_table "entries", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.bigint "user_id", null: false t.bigint "room_id", null: false t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.index ["room_id"], name: "index_entries_on_room_id" t.index ["user_id"], name: "index_entries_on_user_id" end create_table "messages", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.text "message", null: false t.bigint "user_id", null: false t.bigint "room_id", null: false t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.index ["room_id"], name: "index_messages_on_room_id" t.index ["user_id"], name: "index_messages_on_user_id" end create_table "rooms", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.bigint "user_id", null: false t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.index ["user_id"], name: "index_rooms_on_user_id" end create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false t.string "image" t.string "image_cache" t.string "nickname", null: false t.string "comment" t.text "content" t.string "twitter" t.string "instagram" t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "entries", "rooms" add_foreign_key "entries", "users" add_foreign_key "messages", "rooms" add_foreign_key "messages", "users" add_foreign_key "rooms", "users" end

routes.rb

ruby

Rails.application.routes.draw do devise_for :users, controllers: { registrations: 'users/registrations' } root to: "users#index" resources :users resources :messages, only: [:create] resources :rooms, only: [:create, :show] end

自分で調べたことや試したこと

undefined method `update' for nil:NilClassということで、updateする対象の@userが空になっていると思い、まずパラメーターを確認しました。パラメーターの情報は送れていましたので、変数の定義に問題があると思い、users_controllerのupdateの中の@userをcurrent_userにしたところ、unknown attribute 'user_id' for User.という別のエラーが発生してしまい、原因が分からなくなってしまいましたので、お力をお貸しいただければ幸いです。

追記

イメージ説明
ご指摘いただいたように、@user= User.find(params[:id])で値を入れたところ、上記のエラーが発生してしまいました。一応before_actionで括ってみたのですが、再度同じエラーが出ましたので、どなたかご教授いただければ幸いです。

使っているツールのバージョンなど補足情報

Rails 6.0.0
Ruby 2.6.5

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby

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

Ruby on Rails 6

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