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

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

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

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

Q&A

解決済

1回答

1584閲覧

新しいページに行った時のURLの変化

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

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

0グッド

0クリップ

投稿2019/07/16 06:41

編集2019/07/16 08:28

rails でsnsを作っています。ユーザーのマイページで退会ページへのリンクを押して、リンク先にある退会ボタンを押すと退会できるようにしたいと思っています。そこで

ルーティングをこのように
get "users/:id/leave"=>"users#leave"
post "users/:id/destroy"=>"user#destroy"

Usersコントローラーでは、このように
def leave
@user = User.find_by(id: params[:id])
end

def destroy
@user = User.find_by(id: params[:id])
@posts = Post.find_by(id: params[:id])
if @user.destroy
@posts.destroy
redirect_to("/")
flash[:notice] = "アカウントを削除しました"
end
end

leaveビューはこのようにしています

<div class="main user-show"> <div class="container"> <% if @user.id == @current_user.id %> <%= link_to("退会する", "users/:id/destroy") %> <% end %> </div> </div>

マイページで退会ボタンを押して退会ページ(leaveビュー)に移動して、退会ボタンを押すと
localhost:3000/users/:id/destroy 
へ移動してdestroyアクションを実行して欲しいのですが、
退会ボタンを押すとURLが 
http://localhost:3000/users/17/users/:id/destroy 
になってしまいます。
どなたかよろしくお願いします。

Rails.application.routes.draw do post "likes/:post_id/create" => "likes#create" post "likes/:post_id/destroy" => "likes#destroy" post "users/:id/update" => "users#update" get "users/:id/edit" => "users#edit" post "users/create" => "users#create" get "signup" => "users#new" get "users/index" => "users#index" get "users/:id" => "users#show" post "login" => "users#login" post "logout" => "users#logout" get "login" => "users#login_form" get "users/:id/likes"=>"users#likes" get "users/:id/leave"=>"users#leave" post "users/:id/destroy"=>"user#destroy" get "posts/index" => "posts#index" get "posts/new" => "posts#new" get "posts/:id" => "posts#show" post "posts/create" => "posts#create" get "posts/:id/edit" => "posts#edit" post "posts/:id/update" => "posts#update" post "posts/:id/destroy" => "posts#destroy" get "/" => "home#top" end

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

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

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

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

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

guest

回答1

0

ベストアンサー

<%= link_to("退会する", "users/:id/destroy") %>

<%= link_to("退会する", user_path(@current_user),method: :delete) %>
にしてみて下さい。

なお、
User の定義で
accepts_nested_attributes_for :posts
をしておくと、
@posts.destroy
は不要です。

投稿2019/07/16 07:46

winterboum

総合スコア23284

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

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

退会済みユーザー

退会済みユーザー

2019/07/16 08:09

<%= link_to("退会する", "users/:id/destroy") %> を <%= link_to("退会する", user_path(@current_user),method: :delete) %> にすると undefined method `user_path' for #<#<Class:0x0000000006426890>:0x000000000b8c9780> Did you mean? users_index_path というエラーが出てしまいました。
winterboum

2019/07/16 08:11

つづり間違えたかな、 rails routes ってしてみせてください
退会済みユーザー

退会済みユーザー

2019/07/16 08:17

ターミナルで実行すると PS C:\Users\b\sample_app> rails routes Prefix Verb URI Pattern Controller#Action POST /likes/:post_id/create(.:format) likes#create POST /likes/:post_id/destroy(.:format) likes#destroy POST /users/:id/update(.:format) users#update GET /users/:id/edit(.:format) users#edit users_create POST /users/create(.:format) users#create signup GET /signup(.:format) users#new users_index GET /users/index(.:format) users#index GET /users/:id(.:format) users#show login POST /login(.:format) users#login logout POST /logout(.:format) users#logout GET /login(.:format) users#login_form GET /users/:id/likes(.:format) users#likes GET /users/:id/leave(.:format) users#leave POST /users/:id/destroy(.:format) user#destroy posts_index GET /posts/index(.:format) posts#index posts_new GET /posts/new(.:format) posts#new GET /posts/:id(.:format) posts#show posts_create POST /posts/create(.:format) posts#create GET /posts/:id/edit(.:format) posts#edit POST /posts/:id/update(.:format) posts#update POST /posts/:id/destroy(.:format) posts#destroy GET / home#top と出てきました。
winterboum

2019/07/16 08:23

はて、、、、 config/routes.rb を 見せて下さい。 コメントの回答欄でなく、質問の中に<code>をつかって
退会済みユーザー

退会済みユーザー

2019/07/16 08:28

失礼しました 追加しました
winterboum

2019/07/16 08:55 編集

ああ、どうも見慣れぬ rails routes の結果だと思っていたら、やはり routes.rbでresources使っていないんですね。 まだやり直しが効くなら、 resources :users resources :likes resources :posts を使ったほうが、標準のroutesを作ってくれるので、こういうQAの時に混乱しないのでベターだと思います。 resourcesが作ってくれないrouteはresourecesの前に定義しないとだめ、という落とし穴はありますが。 このまま進めるにしても destroy は POST でなく DELETE がよいかと。 そうすると  user_path(@current_user),method: :delete は通ると思います
退会済みユーザー

退会済みユーザー

2019/07/17 06:48

resourcesなんて機能初めて知りました。ありがとうございます! 教えていだたいて申し訳ないのですが、 ("退会する", "users/:id/destroy")を ("退会する", "/users/#{@user.id}/destroy", {method: "post"})にすることで解決しました
winterboum

2019/07/17 07:33

まぁ method: post にしても解決することは判ってたんですが、 show GET create POST update PATCH destroy DELETE という原則を外れないほうが何かと。標準と違うことをやってるとこういう相談の時にいろいろ厄介です 将来複数で開発するとか、人に保守を渡すとかするときもトラブルのもと
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問