現状
ログイン後、自分の情報(メアド、名前、パスワードなど)を変更するページを作成していた。
ある程度作成し終わり、挙動を確かめようとrails sでサーバーを立てて作成したメールアドレス、パスワードでログインし、自身の情報を編集するページに移動して編集をした。編集し終わり、更新ボタンを押したところ下記のエラーが出ました。
したいこと
ユーザー情報を更新できるようにしたい。
原因・考察
調べた限り、下記が原因かと思います。
・no route matchs{:action=>"edit", :controller=>"users", :id=>nil}
→どのuserをeditしたいかを指定するためのid(インスタンス変数はuser)が指定されていない。
→no route matchs でルートがない。
・missing required keys: [:id]
→必須のキーがない。
・current_userの値がnilになっている。
app/models/user.rbをみたところ、update_attributesメソッド他、@userの情報を受け渡しするようなコードが一行も書かれていなかったことに気づく。
image.png
→しかし、チュートリアル7章→app/models/user.rbのコードサンプルをみてもユーザー情報の更新について言及しているコードは見当たらない。
→route.rbでの指定がおかしい?ルートの指定がないのがおかしい?
やったこと
app/controllers/users_controller.rbにeditアクションを追加。
class UsersController < ApplicationController def show @user = User.find(params[:id]) end def new @user = User.new end def create @user = User.new(user_params) if @user.save log_in @user flash[:success] = "Welcome to the Sample App!" redirect_to @user else render 'new' end end def edit #ユーザー情報編集のeditアクション。 app/views/users/edit.html.erb @user = User.find(params[:id]) end def update #ユーザー情報を更新する @user = User.find(params[:id]) if @user.update_attributes(user_params) flash[:success] = "Profile updated" redirect_to @user else render 'edit' end end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end # ログイン済みユーザーかどうか確認 def logged_in_user unless logged_in? flash[:danger] = "Please log in." redirect_to login_url end end end
app/views/users/edit.html.erbに入力フォームを追加。
<% provide(:title, "Edit user") %> <h1>Update your profile</h1> <div class="row"> <div class="col-md-6 col-md-offset-3"> <%= form_for(@user) do |f| %> <%= render 'shared/error_messages' %> <%= f.label :name %> <%= f.text_field :name, class: 'form-control' %> <%= f.label :email %> <%= f.email_field :email, class: 'form-control' %> <%= f.label :password %> <%= f.password_field :password, class: 'form-control' %> <%= f.label :password_confirmation, "Confirmation" %> <%= f.password_field :password_confirmation, class: 'form-control' %> <%= f.submit "Save changes", class: "btn btn-primary" %> <% end %> </div> </div>
・app/views/layouts/_header.html.erbにリンクを追加。
<%= link_to "Settings", edit_user_path(current_user) %>
今回動かしたいのはcontroller/users_controller.rbの editアクションなので、rake routesで正しいルートを確認し、route.rb内に以下を追加。
get '/users/:id/edit', to: 'users#edit'
Rails.application.routes.draw do # ログイン、アカウント編集後、任意のページに推移させるための記述 devise_for :users, :controllers => { :omniauth_callbacks => 'users/omniauth_callbacks', #facebookログイン :registrations => 'users/registrations', #登録時 :sessions => 'users/sessions', :passwords => 'users/passwords' } resources :users get 'users/show' get 'comments/index' root 'static_pages#home' # => root_path get '/users/:id/edit', to: 'users#edit' get '/help', to: 'static_pages#help' get '/about', to: 'static_pages#about' get '/contact', to: 'static_pages#contact' get '/signup', to: 'users#new' # => contact_path # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html #root 'application#hello' end
結果
@userの部分をUser.firstにしたところ、正常に動きました。
ただ、どのユーザーでも動いて欲しいので@userにしたところ同じエラー文が表示されました。
助言、よろしくお願いします。