🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails

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

Q&A

解決済

1回答

1985閲覧

srailsにおいて編集が反映されない件について

dokodoko

総合スコア20

Ruby on Rails

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

0グッド

0クリップ

投稿2020/01/03 08:43

編集2020/01/03 09:37

railsで編集機能が反映されません。

ログインアプリ
ログアウト
マイページ
投稿する
削除
編集
dddddd


いま現在アプリはこのようになっています。

編集ボタンを押すと

http://localhost:3000/posts/4/edit


ログインアプリ
ログアウト
マイページ
投稿する
dddddd 投稿


このようになるのでddddddの部分をupdatedに変えて


ログインアプリ
ログアウト
マイページ
投稿する
updated 投稿


投稿ボタンを押して
http://localhost:3000/posts/5

ログインアプリ
ログアウト
マイページ
投稿する
you posted
go to home

go to homeを押してホームに戻っても

http://localhost:3000/posts


ログインアプリ
ログアウト
マイページ
投稿する
削除
編集
dddddd


このようにddddddのままで困っています。

routes

1Rails.application.routes.draw do 2 devise_for :users 3 4 root to: 'posts#index' 5 resources :posts 6 resources :users 7 end 8

PostsController

1class PostsController < ApplicationController 2 def index 3 4 @posts = Post.all 5 end 6 7 def new 8 @post = Post.new 9 end 10 11 def create 12 Post.create(post_params) 13 end 14 15 16 def edit 17 @post = Post.find(params[:id]) 18 end 19 20 def update 21 @post = Post.find(params[:id]) 22 if post.user_id == current_user.id 23 post.update(post_params) 24 end 25 end 26 27 def show 28 end 29 30 def destroy 31 post = Post.find(params[:id]) 32 if post.user_id == current_user.id 33 post.destroy 34 end 35 end 36 37 38 private 39 def post_params 40 params.require(:post).permit(:text).merge(user_id: current_user.id) 41 end 42end

index

1<div class="posts"> 2 <% @posts.each do |post| %> 3 <li> 4 <%= link_to '削除', "/posts/#{post.id}", method: :delete %> 5 </li> 6 <li> 7 <%= link_to '編集', "/posts/#{post.id}/edit", method: :get %> 8 </li> 9 10 <%= simple_format(post.text) %> 11 <% end %> 12</div> 13

new

1<div class = "posts"> 2 <%= form_for(@post) do |f| %> 3 <%= f.text_field :text %> 4 <%= f.submit '投稿' %> 5 <% end %> 6</div> 7

edit

1<div class = "posts"> 2 <%= form_for(@post) do |f| %> 3 <%= f.text_field :text %> 4 <%= f.submit '投稿' %> 5 <% end %> 6</div> 7

update

1<div class = "posts"> 2 <h3> you posted </h3> 3 4<a class = " btn " href= "/posts"> go to home </a> 5 6 7</div> 8

どうかお力を貸していただけると助かります。よろしくお願いします。

postcontroller

def update
@post = Post.find(params[:id])
if @post.user_id == current_user.id
post.update(post_params)
end
end

postから@postに変更させていただきました。

結果このようにエラーが出ました。

NameError in PostsController#update
undefined local variable or method `post' for #<> Did you mean? @post

@post = Post.find(params[:id])
if @post.user_id == current_user.id
post.update(post_params)          赤のライン
end
end

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/01/03 08:56

post を create したのがべつユーザって可能性はないんですか?  あと update でデータベース関連のエラーってでてないですか?
dokodoko

2020/01/03 09:00

まずご協力ありがとうございます。 一応もう一度確認して来たのですが同一ユーザーでした。 エラーは出ないままホーム画面まで行きます。
退会済みユーザー

退会済みユーザー

2020/01/03 09:07 編集

if post.user_id == current_user.id post.update が @post じゃないのかな… view でつかってないんだったら def update @post = Post.find(params[:id]) こっちを @ とるのでもいいかも あと def update が2個あるのもおかしい気がする
退会済みユーザー

退会済みユーザー

2020/01/03 09:15

post.update(post_params) のほうも @ がいりますね Rails 関係ない ruby の言語レベルの話なのでこれでエラーが出る理由がわからないなら初心者マークつけたほうが優しく解説してもらえていいかもです
dokodoko

2020/01/03 09:20

すいません。アドバイスありがとうございました。 chicaさんの @post = Post.find(params[:id]) こっちを @ とるのでもいいかも の一文を参考にさせていただきました。
退会済みユーザー

退会済みユーザー

2020/01/03 09:21

いままで def update が2つあったせいで後に書いてある方をとおっていて何の処理もされなかった。 下を消したために上の update を通るようになって @post に値を入れてるのに post から値を取り出そうとして nil 参照エラーが出ているという状態だと思います def update 内で使う変数を @post か @ なし post で統一する必要があるんだと思います 解決したら自己回答して解決済みにしてください
dokodoko

2020/01/03 09:22

初心者マークがあるのですね。 わたしはつけるべきだと思います。ご親切にありがとうございます。
dokodoko

2020/01/03 09:26

最後まで私にアドバイスありがとうございます。 協力してもらった立場としてはchicaさんに対してベストアンサーするのが礼儀かなと思うのですが自己解決で構わないのですか?
退会済みユーザー

退会済みユーザー

2020/01/03 09:30

解決内容は質問文に追記じゃなくじぶんで解答欄に記述したほうがいいかもです 未解決、未回答のままだと回答者さんが見に来て無駄な時間を使ってしまうかもしれないので
dokodoko

2020/01/03 09:34 編集

確かに@post にPost.find(params[:id])を収納してるのに if post.user_id == current_user.id ここでpostを記入してもPost.find(params[:id])をchicaさんの言う通り統一しないと呼び出せないと思いました。 わかりやすくありがとうございます。 def update @post = Post.find(params[:id]) if post.user_id == current_user.id post.update(post_params) end end
dokodoko

2020/01/03 09:36 編集

ご指摘ありがとうございます。 わかりました。解決方法の記入場所を修正させていただきます。
dokodoko

2020/01/03 09:57

chicaさんに対してベストアンサーさせていただきたかったのですが申し訳ありません。 ですがchicaさんのおかげ解決できました。ありがとうございます。! 解決したのに未回答のままだと解決するために来てくれた親切な方への配慮が足りませんでした。 以後気をつけます。 ご指摘ありがとうございました。
guest

回答1

0

自己解決

解決方法

PostsController

1 2 3 4class PostsController < ApplicationController 5 def index 6 7 @posts = Post.all 8 end 9 10 def new 11 @post = Post.new 12 end 13 14 def create 15 Post.create(post_params) 16 end 17 18 19 def edit 20 @post = Post.find(params[:id]) 21 end 22 23 24 25 def show 26 end 27  28 def update 29 post = Post.find(params[:id]) 30 if post.user_id == current_user.id 31 post.update(post_params) 32 end 33 end 34 35 36 def destroy 37 post = Post.find(params[:id]) 38 if post.user_id == current_user.id 39 post.destroy 40 end 41 end 42 43 44 private 45 def post_params 46 params.require(:post).permit(:text).merge(user_id: current_user.id) 47 end 48end

この部分を
def update
@post = Post.find(params[:id])
if post.user_id == current_user.id
post.update(post_params)
end
end

こう変えました
def update
post = Post.find(params[:id])
if post.user_id == current_user.id
post.update(post_params)
end
end

投稿2020/01/03 09:42

dokodoko

総合スコア20

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問