####初学者の為、必要な情報が抜けている場合がありますので、ご指摘頂けると幸いです。
前提・実現したいこと
railsにてfrom_tagにて記載した所をform_forに変更したいです。
発生している問題・エラーメッセージ
NoMethodError in Blogs#edit
該当のソースコード
edit.html.erb変更前
<div class="contents row"> <%= form_tag("/tweets/#{@tweet.id}", method: :patch ) do %> <h6>編集する</h6> <textarea cols="30" name="text" placeholder="text" rows="10"><%= @tweet.text %></textarea> <input type="submit" value="SENT"> <% end %> </div>
edit.html.erb変更後
<div class="contents row"> <%= form_for [@tweets] do |f|%> <h6>する</h6> <%= f.text_area :text, placeholder: "Text"%> <%= f.submit "SENT" %> <% end %> </div>
blogs_controller.rb
class BlogsController < ApplicationController before_action :move_to_index, except: :index def index @tweets = Tweet.order("created_at DESC").page(params[:page]).per(5) end def new @tweets = Tweet.new end def create Tweet.create(text: tweet_params[:text], user_id: current_user.id) end def destroy tweet = Tweet.find(params[:id]) tweet.destroy if tweet.user_id == current_user.id end def edit @tweets = Tweet.find(params[:id]) end def update @tweets = Tweet.find(params[:id]) if tweet.user_id == current_user.id tweet.update(tweet_params) end end private def tweet_params params.require(:tweet).permit(:text) end def move_to_index redirect_to action: :index unless user_signed_in? end end
Rails.application.routes.draw do devise_for :users root to: 'blogs#index' get 'tweets' => 'blogs#index' get 'tweets/new' => 'blogs#new' post 'tweets' => 'blogs#create' delete 'tweets/:id' => 'blogs#destroy' patch 'tweets/:id' => 'blogs#update' get 'tweets/:id/edit' => 'blogs#edit' end
試したこと
まず、edit.htmlをform_forに書き換える際にnew.html.erbのform_forを参考にして書きました。
その後、ArgumentError in Blogs#edit エラーが発生した為、blogs_controller.rb内の
def edit @tweet = Tweet.find(params[:id]) を @tweets = Tweet.find(params[:id]) に変更 end def update tweet = Tweet.find(params[:id]) を @tweets = Tweet.find(params[:id]) に変更しました。 if tweet.user_id == current_user.id tweet.update(tweet_params) end end
エラーメッセージを読むにメソッドの私方がおかしいと思うのですが、行き詰まりました。
お手数をお掛けしますが、ご教授おねがいします。
##追記
kuraudo様の回答通りに記入させていただきました。
def update @tweets = Tweet.find(params[:id]) if @tweets.user_id == current_user.id @tweets.update(tweet_params) end end
しかしながら
かわらずでした。
ネットで調べた結果違う書き方?も見つけられましたので、書き込んでみました。
<div class="contents row"> <%= form_for :tweets, url: tweets_path(@tweets), method: :patch do |f| %> <h6>編集する</h6> <%= f.text_area :text, placeholder: "Text"%> <%= f.submit "SENT" %> <% end %> </div>
def update @tweets = Tweet.find(params[:id]) if @tweets.user_id == current_user.id @tweets.update(tweet_params) end end
結果
編集画面を表示することはできましたが、SENTを押すと
ルーティングエラーになりました。
Rails.application.routes.draw do devise_for :users root to: 'blogs#index' get 'tweets' => 'blogs#index' get 'tweets/new' => 'blogs#new' post 'tweets' => 'blogs#create' delete 'tweets/:id' => 'blogs#destroy'  patch 'tweets/:id' => 'blogs#update' get 'tweets/:id/edit' => 'blogs#edit' end
ルーティングがおかしいのでしょうか?
回答2件