shunta9922
@shunta9922 (shimo shun)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

tweetの削除・編集が機能しない

railsを初めて数か月の初学者です。
prograteを見ながら、見た映画をtweetできるwebappを開発しています。

tweetを投稿できるのですが、編集と削除を行うとエラーが発生します。
エラー画面からブラウザバックしてみると削除「初めて数か月の初学者です。
prograteを見ながら、見た映画をtweetできるwebappを開発しています。

tweetを投稿できるのですが、編集と削除を行うとエラーが発生します。
エラー画面からブラウザバックしてみると削除のみできています。

発生している問題・エラー

NoMethodError in MovieController#destroy
undefined method `destroy' for nil:NilClas

NoMethodError in Movie#edit
undefined method `id' for nil:NilClass

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

routes.rb
get "movie/:id/edit" => "movie#edit"
post "movie/:id/update" => "movie#update"
post "movie/:id/destroy" =>"movie#destroy"

movie_controller.rb

 def edit
  @movie=Movie.find_by(id:params[:id])
  end

  def update
    @movie=Movie.find_by(id:params[:id])
   @movie.content=params[:content]
    @movie.save
    redirect_to("/movie/index")    

  end 

  def destroy
    @movie=Movie.find_by(id:params[:id])
    @movie.destroy
    @movie.save
   redirect_to("/movie/index")


  end
show.html.erb
 <body>
 <div class="movie-show-item">
  <p>
   <%= @movie.content %>
  </p>
  <div class="post-time">
    <%= @movie.created_at%>
   </div>
   <%=link_to("編集","/movie/#{@movie.id}/edit")%>
   <%=link_to("削除","/movie/#{@movie.id}/destroy",{method:"post"})%>
 </div>


 </body>

edit.htmlerb
<%=form_tag("/movie/#{@movie.id}/update") do %>
<div class="form">
<div class="form-body">


<textarea name="content"><%= @movie.content %></textarea>
<input type="submit" value="保存">
</div>
</div>
<% end %>

db
20210316015932_create_movies.rb
class CreateMovies < ActiveRecord::Migration[5.2]
  def change
    create_table :movies do |t|
      t.text :content

      t.timestamps
    end
  end
end


自分で試したこと

投稿したtweetが保存されていかもしれないと確認したところ、tweetは保存されていました

0

1Answer

NoMethodError in MovieController#destroy
undefined method `destroy' for nil:NilClas

こちらのエラーは,

movie_controller.rb
  def destroy
    @movie=Movie.find_by(id:params[:id])

この時点で,@movie が見つけられていなそうなので,
params[:id] に正しい値が入っていそうか,
Movie.find_by(id: params[:id]) をした後に @movie に正しい値が入っていそうか確認すると良さそうです.

NoMethodError in Movie#edit
undefined method `id' for nil:NilClass

こちらですが,movie#edit には,id を使っていないので,
view 側で起きているのではないかと推測します.

edit.htmlerb
<%=form_tag("/movie/#{@movie.id}/update") do %>
<div class="form">
<div class="form-body">


<textarea name="content"><%= @movie.content %></textarea>
<input type="submit" value="保存">
</div>
</div>
<% end %>

こちらですと,@movienil であれば同様のエラーになりそうです.

movie_controller.rb
 def edit
  @movie=Movie.find_by(id:params[:id])
  end

destory と同じ内容のソースコードなので,
こちらも同じ部分を確認すると良さそうです.

1Like

Comments

  1. @shunta9922

    Questioner

    ご指摘ありがとうございます。
    @movie=Movie.find_by(id:params[:id])の後に@movie.present?を加えてみたらエラーがなくなりました!
  2. 解決したなら良かったです!

Your answer might help someone💌