railsの勉強を始めて1週間ほどになりますが、以下記載の部分に詰まっています。
原因、解消方法をご教示いただけますでしょうか。
【作成中のもの】
・ブログの投稿・編集・表示を行うシステムを作成中。
【実現したいこと】
・「新規投稿」と「既存記事の編集」で同じアクション(editアクション)を使用し、投稿画面を表示したい
(新規投稿の場合⇒入力フォームが空の状態の投稿画面を表示する。
既存記事編集の場合⇒記事の詳細画面で「編集する」を押下すると、入力フォームに既存記事の値が入力された状態で投稿画面を表示する)
・上記太線部分の実現にあたり、findメソッドでデータベースからレコード(編集したい記事)を取得し、カラムに格納されている文字列を入力フォームに初期値として表示したい。←ここで下記のエラーが発生している。
【エラーの内容】
・ソースコード「blogs_controller.rb」の19行目以降で「NoMethodError」が出てしまう。
(記事の詳細画面から「編集する」を押下した際に表示される)
【試してみたこと・現時点で判明していること】
・「blogs_controller.rb」18行目(logger.debug(@blog.content)の実行)でデータベースから値を取得できているかを確認
⇒取得できていることを確認済
・19行目のコメントアウト(#@blog = Blog.new)をはずした状態で実行
⇒エラーは出ずに画面遷移する(フォームに値は入っていない)
【ソースコード】
▼コントローラー(blogs_controller.rb)
class BlogsController < ApplicationController def index @blogs = Blog.all end def edit #新規or編集を判断する。 itemid = params[:id] if itemid.nil? #新規ならBlogインスタンスを新しく作る @blog = Blog.new else #新規でないなら取得したblogをそのまま使う @blog = Blog.find(itemid) logger.debug(@blog.content) #@blog = Blog.new end end def create @blog = Blog.new(blog_params) if @blog.save redirect_to blogs_url else render :new end end def display @blog = Blog.find(params[:id]) end private def blog_params params.require(:blog).permit(:content) end end
▼投稿画面(edit.html.erb)
<h1>ブログ新規投稿</h1> <%= form_with(model: @blog,local:true) do |f| %> <%= f.label :content,'内容' %> <%= f.text_field :content %> <%= f.submit '投稿する' %> <% end %> <%= link_to 'トップページへ戻る',blogs_path %>
▼詳細画面(詳細画面から「編集する」押下で投稿画面に遷移した場合は入力フォームに値が入った状態で表示される)
<h1>詳細表示画面</h1> <%= @blog.content %> <%= link_to '編集する',"/blogs/edit/#{@blog.id}" %> <%= link_to 'トップページへ戻る',blogs_path %>
▼ルーター(routes.rb)
Rails.application.routes.draw do #ルートパス root to:"blogs#index" #一覧画面表示 get 'blogs',to:'blogs#index' #新規投稿画面を開く get 'blogs/edit',to:'blogs#edit' #新規投稿 post 'blogs',to: 'blogs#create' #詳細画面表示 get 'blogs/:id',to:'blogs#display' #編集する(新規投稿画面と同じ画面を開く) get 'blogs/edit/:id',to:'blogs#edit' end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/14 15:07