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

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

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

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

Ruby on Rails

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

HTML

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

Q&A

解決済

2回答

650閲覧

form_tagをfrom_forに変えたいです。

Rick_darts

総合スコア10

Ruby

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

Ruby on Rails

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

HTML

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

0グッド

1クリップ

投稿2019/10/25 17:38

編集2019/10/26 05:25

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

前提・実現したいこと

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' ![イメージ説明](b23843e07818ab3042ee8335d908e556.png) patch 'tweets/:id' => 'blogs#update' get 'tweets/:id/edit' => 'blogs#edit' end

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

イメージ説明

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

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

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

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

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

kuraudo

2019/10/25 17:51

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

2019/10/25 17:58

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

2019/10/25 18:08 編集

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

2019/10/26 04:40

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

2019/10/26 14:51

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

2019/10/26 15:52

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

回答2

0

自己解決

edit.html

<%= form_for :tweet, url: tweets_path(@tweet) do |f| %> <h6>編集する</h6> <%= f.text_area :text, placeholder: "Text"%> <%= f.submit "SENT" %> <% end %>

editはルートができていませんとなっていましたが、ルーティングは完了しておりform_tagの時はできていた為
おかしい書き方をしていると考え余計な物をおとしました(method: patch)を消しました。

controll

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 @tweet = Tweet.find(params[:id]) end def update @tweet = Tweet.find(params[:id]) if tweet.user_id == current_user.id Tweet.update(tweets_params) end end private def tweet_params params.require(:tweet).permit(:text) end def tweets_params params.permit(:text) end def move_to_index redirect_to action: :index unless user_signed_in? end end

コントロールはform_tagで出来ていた時の書き方などを見比べていたら、
require(:tweet)が邪魔している時があったのでdefのtweets_paramsを作り別ルート
作りました。
また、変数名もアドバイスいただいた通りtweetで統一しました。
またdefのupdate内にある Tweet.update(tweets_params)の頭文字が小文字になっておりました。

投稿2019/10/26 15:48

Rick_darts

総合スコア10

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

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

kuraudo

2019/10/26 16:02 編集

自己解決おめでとうございます!! 間が空いてしまい回答仕切れませんでした..失礼しました。 またこれはこれで良いと思うのですが実はそもそもform_tagやform_forはRailsの5.1系以降では非推奨になりform_withなるものが登場しました。 知っておくだけでも良いかも知れません。↓ https://techracho.bpsinc.jp/hachi8833/2017_05_01/39502
Rick_darts

2019/10/27 01:37

なるほど! 読ませていただきます! ありがとうございました。
guest

0

1つ気になった点が(すいません、ここだけで解決するか分かりませんが)

def update @tweets = Tweet.find(params[:id]) if tweet.user_id == current_user.id tweet.update(tweet_params) end end

この部分、@tweetsのインスタンス変数に変えたのは良いとして
それ以降で使っているtweet変数が逆に定義されてないものになっていませんか?

なので統一して下記のようにするのが良いかと思います。

def update @tweets = Tweet.find(params[:id]) if @tweets.user_id == current_user.id @tweets.update(tweet_params) end end

しかし、そもそも @tweets と言う変数名はここで適切かどうかと言うことも考えたいです。

Tweet.find(params[:id]) この部分で"1つのツイート"に絞っているのでやはり
tweetsではなくtweetの方が相応しくないでしょうか?

加えてインスタンス変数はView側に変数を伝達するための機能を持っておりupdate時には行う必要はないと思うので
普通の tweet って変数がこの場合相応しいでしょう。

投稿2019/10/25 17:54

編集2019/10/25 18:01
kuraudo

総合スコア137

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問