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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

解決済

form_tagをfrom_forに変えたいです。

Rick_darts
Rick_darts

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

2回答

0評価

1クリップ

14閲覧

投稿2019/10/25 17:38

編集2022/01/12 10:58

####初学者の為、必要な情報が抜けている場合がありますので、ご指摘頂けると幸いです。

前提・実現したいこと

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

ルーティングがおかしいのでしょうか?

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

kuraudo
kuraudo

2019/10/25 17:51

発生している問題・エラーメッセージ を以下の文言だけでなく NoMethodError in Blogs#edit 丸々と載せて頂いた方が、回答者側からすると良いかも知れません。
Rick_darts
Rick_darts

2019/10/25 17:58

なるほど、ありがとうございます。 修正いたします。
kuraudo
kuraudo

2019/10/25 18:08 編集

また詳細にエラーを載せてくださったところで気になったのが undefined method 'tweet_path' とあるのですが、ひょっとしてrouteファイルにupdateするためのルーティングが設定されていなかったりしませんか?\(勘違いかも\.\.\?\) routes\.rb はこの場合大事なファイルなので質問のところに追記しておくと正確な回答ができるかと思います。
Rick_darts
Rick_darts

2019/10/26 04:40

ありがとうございます。 routesを記入させていただきました。 updateのrouteは記入しておりました。
kuraudo
kuraudo

2019/10/26 14:51

ありがとうございます 後で続き見ようと思います
Rick_darts
Rick_darts

2019/10/26 15:52

数々のご指摘ありがとうございました。 無理やりのクソコードにはなりましたが、解決しました。 解決したコードを載せておりますので、気になった点ありましたらご教授お願いします。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。