我正在为rails 3编写一本railtutorial.org在线书,我已经完成了第11章的大部分内容,在其中我们添加了提交微信的能力。添加适当的代码后,我无法呈现页面。以下是返回的错误:
NoMethodError in Pages#home
显示c:/rails_projects/sample_app/app/views/shared/_error_messages.html.erb所在的>#1行:
当你没有预料到的时候,你就有了一个零目标!您可能会期望ActiveRecord::Base的实例。在计算nil.errors提取的源时(围绕第1行)时发生了错误:
1:<% if @user.errors.any? %>
2:<div id="error_explanation">
3:<h2><%= pluralize(@user.errors.count, "error") %>
4:prohibited this <%= object.class.to_s.underscore.humanize.downcase %>
模板包含的跟踪:app/view/shared/_micropost_form.html.erb,>app/view/pages/ome.html.erb
如果我从app\views\shared_micropost_form.html.erb <%=呈现'shared/error_messages‘:object => f.object %>中删除以下行,则页面将正确呈现
任何帮助都是非常感谢的。
发布于 2010-10-15 07:10:57
这是因为您正在将一个变量object
传递到您的分部,但是在这个部分中,您尝试使用一个名为@user
的变量。将该部分中的@user
的每个实例更改为object
,它将很好地工作。
1:<% if object.errors.any? %>
2:<div id="error_explanation">
3:<h2><%= pluralize(object.errors.count, "error") %>
4:prohibited this <%= object.class.to_s.underscore.humanize.downcase %>
更新:只是为了澄清一下,上面的答案是假设设置@user变量有问题,但没关系。当您在呈现调用中说:object => f.object
时,您告诉render
接受此表单所基于的对象,并将其发送到具有变量名称object
的部分。
将错误代码重构为共享部分的全部要点是,它将被多个表单使用,用于不同的模型。在这个部分中,您不能说是@user
,因为您将在所有其他模型中使用相同的部分。这就是为什么将部分中的代码更改为使用更通用的变量名object
的原因。
发布于 2010-10-15 07:04:07
这告诉您@user
对象是零。您应该确保在控制器pages#home
中实际为@user
设置一个值。如果您在回收表单帖子上的错误后重定向到主页,那么在重定向之后,您将不再拥有instances变量@user。如果希望在表单post错误消息中包含原始post值以呈现视图,则最常见的做法是:
# Some controller
def create
begin
@user = User.create(params[:user])
rescue ActiveRecord::RecordInvalid => e
@errors => e.record.full_error_messages
render :action => "new"
end
end
我不知道教程会让您做什么,但是如果您在pages_controller#home中发布了代码,那么我们可以告诉您更多。
发布于 2010-10-15 08:08:02
似乎在您正在访问的控制器操作中没有@user变量
我会试着
<% if @user && @user.errors.any? %>
如果有@user,那么它将检查@user.errors.any
另外,如果你用的是设计,你可以试试
<% user_signed_in? && @user.errors.any? %>
https://stackoverflow.com/questions/3940087
复制相似问题