几天前,我问了一个非常类似的问题,但我仍然不知道该怎么做。我所做的是,在博客的帖子下创建了评论部分,所有评论始终可见,并且我希望我的应用程序在新评论未通过验证时(出现错误时)也显示所有评论,并且我还想在所有数据库记录下看到该错误。我只是一直做不到。
问题是,当我不希望我的应用程序在同一页面上显示所有注释时(我将这部分从我的Learn_webdeb文件中临时删除),
<% @mains.each do |a| %>
<tr>
<td><%= a.title %></td>
<td><%= a.body %></td>
</tr>
<% end %>
一切正常,当新评论未通过验证时,将显示错误。但是,当我还要在同一页面上显示以前保存的所有数据库记录时,会出现此错误:
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'
在这里,您有我的控制器:
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
我的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_webdeb"
render <action>
使用实例变量,该实例变量在调用它的地方可用(create
在您的示例中为action),而@mains
实例变量在您的视图中不可用(因为该变量learn_webdeb
仅在action中定义),因此在您的视图中不可用。
要解决此错误,您需要致电redirect
而不是render
:
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
在create动作中定义并调用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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句