1. ホーム
  2. ruby-on-rails

[解決済み] エラーメソッドで呼び出すと、「nil:NilClass の未定義メソッド `errors'」が発生する。

2022-02-19 04:29:52

質問

私は現在、独学でRoRを学び、チュートリアルを行っていますが、bootstrapを使ってより良いレイアウトやものを追加しているところですが、解決できない問題に遭遇しています。

バリデーション部分( http://guides.rubyonrails.org/getting_started.html#adding-some-validation )を使っているのですが、その際に

<% @post.errors.any? %>

こんなメッセージが出ます。

undefined method `errors' for nil:NilClass
Extracted source (around line #9):
<legend><h1>Add Post</h1></legend>

<%= form_for :post, url: posts_path, html: {class: 'form-horizontal'} do |f| %>
      <% if @post.errors.any? %>
        <div id="errorExplanation">

チュートリアルの部分をコピーして貼り付けただけで、何も動作しません。

以下は、ビューのコードです。

<p> </p>

<div class="span6"

<fieldset>
    <legend><h1>Add Post</h1></legend>

    <%= form_for :post, url: posts_path, html: {class: 'form-horizontal'} do |f| %>
          <% if @post.errors.any? %>
            <div id="errorExplanation">

                <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>

                <ul>
                    <% @post.errors.full_messages.each do |msg| %>
                    <li><%= msg %></li>
                    <% end %>
                  </ul>
            </div>
  <% end %>
        <div class="control-group">
            <%= f.label :title, :class => 'control-label' %>
            <div class="controls">
                <%= f.text_field :title, :class => 'span4' %>
            </div>
        </div>

        <div class="control-group">
            <%= f.label :content, :class => 'control-label' %>
            <div class="controls">
                <%= f.text_area :content, :rows => '7', :class => 'input-block-level' %>
            </div>
        </div>

        <div class="form-actions">
            <%= f.submit "Add Post", :class => 'btn btn-success' %>
            <%= link_to "Cancel", posts_path, :class => 'btn', :style => 'float:right;' %>
        </div>
    <% end %>
</fieldset>

</div>

そして、私のposts_controller。

class PostsController < ApplicationController

    def new
    end

    def create
        @post = Post.new(params[:post].permit(:title, :content))

        if @post.save
            redirect_to @post
        else
            render 'new'
        end
    end

    def show
        @post = Post.find(params[:id])
    end

    def index
        @posts = Post.order("created_at desc")
    end

    private
        def post_params
            params.require(:post).permit(:title, :content)
        end

end

何が足りないのでしょうか?ありがとうございました。

解決方法は?

を定義する必要があります。 @post の中で new のアクションもあります。

def new
  @post = Post.new
end

を取得していますね。 NilClass エラーは @post には値がありません。 (それは nil ) で最初にフォームを読み込んだとき new アクションを実行します。

を実行すると render :new の中で create アクションを使用しているので、問題はありません。 @post の先頭で定義した create .