Database Rails 4-错误消息和同一页面上的所有数据库记录

Database Rails 4-错误消息和同一页面上的所有数据库记录,database,validation,ruby-on-rails-4,Database,Validation,Ruby On Rails 4,几天前我问了一个非常类似的问题,但我还是不知道怎么做。我所做的是,我在我的博客上的帖子下创建了评论部分,所有评论始终可见,我希望我的应用程序在新评论未通过验证(出现错误时)时也显示所有评论,我还希望在所有数据库记录下看到该错误。我只是一直没能做到 问题是,当我不希望我的应用程序在同一页上显示所有注释时 (我从我的learn_webdeb文件中临时删除此部分) 一切正常,当新注释未通过验证时,将显示错误。但当我还想在同一页面上显示以前保存的所有数据库记录时,我会遇到以下错误: Showing

几天前我问了一个非常类似的问题,但我还是不知道怎么做。我所做的是,我在我的博客上的帖子下创建了评论部分,所有评论始终可见,我希望我的应用程序在新评论未通过验证(出现错误时)时也显示所有评论,我还希望在所有数据库记录下看到该错误。我只是一直没能做到

问题是,当我不希望我的应用程序在同一页上显示所有注释时 (我从我的learn_webdeb文件中临时删除此部分)


一切正常,当新注释未通过验证时,将显示错误。但当我还想在同一页面上显示以前保存的所有数据库记录时,我会遇到以下错误:

Showing /home/mateusz/Pulpit/Aptana3_Workspace/My_webpage/app/views/mains/learn_webdeb.html.erb where line #33 raised:

undefined method `each' for nil:NilClass

Extracted source (around line #33):

</thead>
<tbody>
<% @mains.each do |a| %>
<tr>
<td><%= a.title %></td>
<td><%= a.body %></td>

Rails.root: /home/mateusz/Pulpit/Aptana3_Workspace/My_webpage
Application Trace | Framework Trace | Full Trace

app/views/mains/learn_webdeb.html.erb:33:in `_app_views_mains_learn_webdeb_html_erb__2599098263892148643_20921680'
app/controllers/mains_controller.rb:26:in `block (2 levels) in create'
app/controllers/mains_controller.rb:22:in `create'
Showing/home/mateusz/Pulpit/Aptana3_Workspace/My_webpage/app/views/mains/learn_webdeb.html.erb,其中第33行出现:
nil:NilClass的未定义方法“each”
提取的源(第33行附近):
Rails.root:/home/mateusz/Pulpit/Aptana3_Workspace/My_网页
应用程序跟踪|框架跟踪|完整跟踪
app/views/mains/learn_webdeb.html.erb:33:in`` app_views_mains_learn_webdeb_html_erb_25990998263892148643_20921680'
app/controllers/mains_controller.rb:26:in'block(2层)in create'
app/controllers/mains_controller.rb:22:in'create'
这是我的控制器:

class MainsController < ApplicationController
  def learn_webdeb
    @main = Main.new
    @mains = Main.all
  end

  def motivation
  end

  def about
  end

  def books_courses
  end

  def contact
  end

  def create
    @main = Main.new(main_params)

    respond_to do |format|
      if @main.save
        format.html { redirect_to learn_webdeb_path }
      else
        format.html { render controller: "mains", action: "learn_webdeb" }
      end
    end
  end

  def show
    redirect_to :action => "learn_webdeb"
  end

  private

    def main_params
      params.require(:main).permit(:title, :body)
    end

end
class MainsController“learn\u webdeb”
结束
私有的
def主参数
参数require(:main).permit(:title,:body)
结束
结束
以及我的learn_webdeb视图文件的重要部分:

...

<table class="table">
    <thead>
        <tr>
            <th>Name:</th>
            <th>Comment:</th>
        </tr>
    </thead>
    <tbody>

<% @mains.each do |a| %>
            <tr>
                <td><%= a.title %></td>
                <td><%= a.body %></td>
            </tr>
<% end %>

    </tbody>
</table>
<%= form_for(@main) do |main| %>
    <div>
        <%= main.label :title %>
        <%= main.text_field :title %>
    </div>
    <div>
        <%= main.label :body %>
        <%= main.text_area :body %>
    </div>
    <div>
        <%= main.submit "Submit" %>
    </div>

    <% if @main.errors.any? %>
        <div>
            <% @main.errors.full_messages.each do |msg| %>
                <p><%= msg %></p>
            <% end %>
        </div>
    <% end %>
<% end %>
。。。
姓名:
评论:

谁能给我解释一下: 1.如何消除此错误,并在同一页面上显示所有数据库记录和验证错误?
2.为什么会发生此错误,代码背后发生了什么?

您的错误发生是因为您在控制器中调用了此命令

render controller:“mains”,action:“learn\u webdeb”

render
使用实例变量,这些变量在调用它的操作中可用(
create
操作在您的示例中),并且
@mains
实例变量在此操作中在您的视图中不可用(因为它仅在
learn\u webdeb
操作中定义)

要修复此错误,您需要调用
重定向
,而不是
渲染

def create
  @main = Main.new(main_params)

  respond_to do |format|
    if @main.save
      format.html { redirect_to @main }
    else
      format.html { redirect_to learn_webdeb_path }
    end
  end
end
如果需要在同一页面上显示验证错误,则应在创建操作中定义
@mains
,并调用
render
,而不是
redirect

def create
  @main = Main.new(main_params)
  @mains = Main.all

  respond_to do |format|
    if @main.save
      format.html { redirect_to @main }
    else
      format.html { render :learn_webdeb }
    end
  end
end
def create
  @main = Main.new(main_params)
  @mains = Main.all

  respond_to do |format|
    if @main.save
      format.html { redirect_to @main }
    else
      format.html { render :learn_webdeb }
    end
  end
end