twitterのような簡易ツイートアプリを作成しています。
やりたい内容は、ツイートが3文字未満、200文字より大きければ、送信時にエラーメッセージを出すようにしたいです。
バリデーションは定義しています。
tweet.rb
class Tweet < ApplicationRecord validates :text, length: { in: 3..200 } belongs_to :user has_many :comments end
こちらはツイート送信のビューです。
3行目にrenderを記述しました。
new.html.haml
.new-field = form_tag('/tweets', method: :post) do = render 'layouts/error' %h3.new-tweets ツイートする %textarea{placeholder: "ツイート文を入力してください", name: "text", cols: "50", rows: "20", class: "new-text"} %input{type: "submit", class: "new-submit"}/ %i.fas.fa-camera
renderから引っ張り出しているのはこのファイルです。
今は仮置きしていますが、ツイートが3文字未満、200文字より大きければ、2行目を表示させたいです。
_error.html.haml
- if @tweet.errors.any? .aaa エラー
バリデーションで新たに記述したのは4行目から8行目です。
tweets_controller.rb
def create @tweet = Tweet.create(text: tweet_params[:text], user_id: current_user.id) redirect_to tweets_path if @tweet.save redirect_to :root else render 'new' end end
上記の4つのファイルを編集すると必ずこのエラーが発生します。
NoMethodError in Tweets#new undefined method `errors' for nil:NilClass - if @tweet.errors.any? .aaa エラー
バリデーションに関することを調べましたが、どの記事でも同じエラーが出ていて困っています。。。
よろしくお願いします。
#補足
tweets_controller.rb
class TweetsController < ApplicationController def index # @tweet = Tweet.find(params[:id]) @tweets = Tweet.includes(:user).order("created_at DESC") end def show # @tweet = Tweet.find(params[:id]) end def new end def create @tweet = Tweet.create(text: tweet_params[:text], user_id: current_user.id) redirect_to tweets_path if @tweet.save redirect_to :root else render 'new' end end private def tweet_params params.permit(:text) end end
newは何も定義していないです。
よろしくお願いします。
#補足2
遅くなり、すみません。
回答ありがとうございます!
def new @tweet = Tweet.new end
こう付け足してみましたが、先ほどと違うエラーが出てしまいました。
エラーはrender 'new'に赤マークが出ていました。
AbstractController::DoubleRenderError in TweetsController#create Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".
調べると
def create @tweet = Tweet.create(text: tweet_params[:text], user_id: current_user.id) redirect_to tweets_path and return if @tweet.save redirect_to :root else render 'new' end end
redirect_to tweets_pathの後ろにand returnを付け足すとエラーは消えました。
今は バリデーションの設定はしてありますので、エラーメッセージは出ないだけでツイート送信したらツイート画面に遷移されますが、ツイートは送信されません。
エラーメッセージが出てエラーだったらそのページから動かない設定をしたいです。。。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー