###前提・実現したいこと
Ruby on Railsのチュートリアルで勉強をしていたところ、演習で行き詰まってしまいました。ルーティングが不正と思われることまでは確認できたのですが、それを正しく修正する方法がわかりません。
###発生している問題・エラーメッセージ
ログインしたユーザのプロフィールを編集するというページで、更新のボタンを押下した際にエラーが発生し、正しく処理されません。
以下のURLの演習2が正しく実装されていないようです。
URL:https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.0#sec-edit_form
Routing Error No route matches [PATCH] "/users/1/edit"
###該当のソースコード
Ruby
1[route.rb] 2Rails.application.routes.draw do 3 root 'static_pages#home' 4 get '/help', to: 'static_pages#help' 5 get '/about', to: 'static_pages#about' 6 get '/contact', to: 'static_pages#contact' 7 get '/signup', to: 'users#new' 8 get '/login', to: 'sessions#new' 9 post '/login', to: 'sessions#create' 10 post '/signup', to: 'users#create' 11 delete '/logout', to: 'sessions#destroy' 12 resources :users 13end
Ruby
1[edit.html.erb] 2<% provide(:title, 'Edit user') %> 3<% provide(:button_text, 'Save changes') %> 4<% provide(:url, edit_user_path) %> <!-- ←試しに実装して失敗 --> 5<h1>Update your profile</h1> 6<div class="row"> 7 <div class="col-md-6 col-md-offset-3"> 8 <%= render 'form' %> 9 <div class="gravatar_edit"> 10 <%= gravatar_for @user %> 11 <a href="http://gravatar.com/emails" target="_blank">Change</a> 12 </div> 13 </div> 14</div>
Ruby
1[_form.html.erb] 2<%= form_for(@user,url: yield(:url)) do |f| %> 3 <%= render 'shared/error_messages', object: @user %> 4 5 <%= f.label :name %> 6 <%= f.text_field :name, class: 'form-control' %> 7 8 <%= f.label :email %> 9 <%= f.email_field :email, class: 'form-control' %> 10 11 <%= f.label :password %> 12 <%= f.password_field :password, class: 'form-control' %> 13 14 <%= f.label :password_confirmation %> 15 <%= f.password_field :password_confirmation, class: 'form-control' %> 16 17 <%= f.submit yield(:button_text), class: "btn btn-primary" %> 18<% end %>
###試したこと
元々「_form.html.erb」の内容は「edit.html.erb」に実装されており、その時点では上手くいきました。
「_form.html.erb」の内容は他のソースと重複するので、リファクタリングしようというのが演習で、今のようなソースコードに修正した際に問題が発生しました。
演習前のソースに戻して画面上でソースを確認したところ、formのaction属性が「action="/users/1"(1はユーザID)」となっているので、この形式にルーティングをしようとしました。以下のようにルーティングを確認して、「route.rb」に『patch '/edit_user' to: 'users#update'』のようなルーティングの設定をいくつか試してみたのですが、解決には至りませんでした。
$ rails routes Prefix Verb URI Pattern Controller#Action root GET / static_pages#home help GET /help(.:format) static_pages#help about GET /about(.:format) static_pages#about contact GET /contact(.:format) static_pages#contact signup GET /signup(.:format) users#new login GET /login(.:format) sessions#new POST /login(.:format) sessions#create POST /signup(.:format) users#create logout DELETE /logout(.:format) sessions#destroy users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new edit_user GET /users/:id/edit(.:format) users#edit user GET /users/:id(.:format) users#show PATCH /users/:id(.:format) users#update PUT /users/:id(.:format) users#update DELETE /users/:id(.:format) users#destroy
###補足情報(言語/FW/ツール等のバージョンなど)
環境:Cloud9
ruby:2.3.0
Rails:5.0.0.1
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/16 20:59