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

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

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

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

Q&A

解決済

1回答

1324閲覧

モデルの値を入力フォームに初期値として設定したいが、NoMethodErrorが表示されてしまう。

shirai_k

総合スコア1

Ruby on Rails

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

0グッド

0クリップ

投稿2021/01/13 13:35

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

コツコツ書くのではなく
resources :blogs
にしてみてください

投稿2021/01/13 14:04

winterboum

総合スコア23401

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

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

shirai_k

2021/01/14 15:07

ご回答いただきありがとうございます! ルート設定をresources:blogsで書き換え+「編集する」押下時はインスタンス変数に値を格納した状態でnewアクションにrenderする…という実装で解消できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問