初歩的なお話ですみません。
twitterのような簡易アプリを作成しているのですが、ルーティングの構成で躓いてしまいました。
削除を実装しようとしていた所です。
削除のビューへ飛んだら
DELETE /tweets/:id(.:format) tweets#destroy
こちらにパスされます。
ここまでは問題なくできているのですが、画面の左上のリロードするマークを押してリロードすると
showアクションが動き出すので、show.html.hamlに記述した内容が反映されます。
何故、showが動くのでしょうか?
showは詳細を実装する時に使うと思っていたのですが・・・(今回の内容では詳細は実装しません)
routes.rb
Rails.application.routes.draw do
devise_for :users
root 'tweets#index'
patch '/tweets/:id/edit', to: 'tweets#update'
resources :tweets do
resources :comments, only: [:index, :create]
end
end
ルーティングはこのようになっています。
今は、resources :tweets doにしていますが、使わないアクションがいくつかあるので
全て実装終わった時に変更しようと思っていますが、これが原因だったりしますでしょうか?
かなり初歩的な質問ですが、ご回答頂けると助かります。
よろしくお願いします。
補足
def destroy
tweet = Tweet.find(params[:id])
if tweet.user_id == current_user.id
tweet.destroy
end
end
destroy.html.haml
.destroy
.destroy2
削除できました
= link_to "戻る", "/", class: "destroy3"
index.html.haml
.chatmain
- @tweets.each do |tweet|
.tweets
.name
= tweet.user.name
.messa
= tweet.text
= link_to "返信", "tweets/#{tweet.id}/comments", class: "comments"
- if user_signed_in? && current_user.id == tweet.user_id
= link_to "編集", "/tweets/#{tweet.id}/edit", method: :get, class: "edit"
= link_to "削除", "/tweets/#{tweet.id}", method: :delete, class: "delete"
.time
= tweet.created_at.strftime("%Y/%m/%d %H:%M")
.tweets2
= link_to new_tweet_path do
%i.fas.
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
ああ、こういうことか
チャットメインから削除を実行したら、destroy view がないというエラーになったので、destroy の viewを作った。
エラーはなくなり、destroy の画面が出た
そこでブラウザのリロードボタン(と言うのかな?)を押した
らshowになった、ということですね。
コントローラのdef destroy の最後に、
削除成功したら行って欲しい view(と flash メッセージ)
失敗したら行って欲しいview(と flash メッセージ)
権限が無いときに行って欲しいview(と flash メッセージ)
を定義するのが普通です。destroyのviewは作りません
例えば
def destroy
@tweet = Tweet.find(params[:id])
if tweet.user_id == current_user.id
if @tweet.destroy
flash[:info] = "削除成功"
render action: :index
else
flash[:alert] = "失敗"
render action: :show
end
else
flash[:alert] = "権限なし"
render action: :show
end
end
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
Youichi256
2020/02/06 17:07
タグの「ルーティング」は、今回の質問とは違いそうです。
no1knows
2020/02/06 20:00
> 削除のビューへ飛んだら
というところが不思議な表現となっていますがどのようなことでしょうか?
またTweetsコントローラーのdestroyアクションを追記していただけるとより適切な答えがつくと思います。
yume0409
2020/02/07 13:56
チャットメインのビューから削除ボタンを押して、削除アクションのビューが表示されたリロードするとshowアクションが動いてshowのビューが表示されると言った形です。
winterboum
2020/02/07 14:09
そのviewのソースが必要ですね。
yume0409
2020/02/07 14:22
destroy.html.hamlは作っています。
中身も記述しました。
winterboum
2020/02/07 14:47
いえ、
回答するに当たり、そのソースがないと判断できないので載せてください
という意味です
winterboum
2020/02/07 14:48
チャットメインのビュー も有ったほうが良さそう
no1knows
2020/02/07 15:44
回答とは別のお話ですが、rails g scaffold でできるファイルとその中身がどのような動きをしているのかをじっくり確認したほうが良い気がします。
このコマンドでできるファイルたちがRailsアプリの基本的な作り方となります。
Railsのレールに乗らず(知らず)に開発するのは、開発効率としてももったいないですし、Railsの理解やスキルの取得がかなり遅くなってしまうと思います。
もし時間が許すようであれば、新しいテストアプリを作って、下記などを参考にレールに乗ることを覚えるのも1つかと。
http://kanjihtmt.github.io/blog/2015/04/02/scaffold/
もちろん、今回のdestroyも理解ができるかと思います。