【问题标题】:undefined method `errors' for nil:NilClass, intermediate html filenil:NilClass,中间html文件的未定义方法“错误”
【发布时间】:2016-08-31 14:03:31
【问题描述】:

我在注册时尝试呈现部分错误时收到此错误undefined method `errors' for nil:NilClassNoMethodError in Pages#registration。我将实际的注册表单制作为部分表单,然后将其呈现为不同页面的选项卡内容,所以现在当我尝试呈现错误消息时,它首先通过导致错误的中间页面,无论如何解决这个问题,或者是否有必要将注册表单作为实际视图而不是局部视图。我从新的操作部分渲染了错误部分。

这是registration.html文件

    <!doctype html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <title>jQuery UI Tabs - Default functionality</title>
     <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/dark-hive/jquery-ui.css">
    </head>
    <body>

    <div id="tabs">
      <ul>
        <li><a href="#customer_register">Customer</a></li>
        <li><a href="#vendor_register">Vendor</a></li>
      </ul>
      <div id="customer_register">
      <%= render "customers/new", customer: @customer %>

      </div>
      <div id="vendor_register">
      <%= render "customers/new", vendor: @vendor %>  
      </div>
    </div>


    </body>
    </html>

以及控制器的create方法

def create
        @customer = Customer.new(customer_params)
        if @customer.save
            flash[:success] = "Welcome to Discount Now #{customer.first_name} #{customer.last_name}"
            redirect_to dashboard_path
        else
            render 'pages/registration'
        end
    end

注册文件将新操作呈现为选项卡的内容。

错误信息部分:

<% if obj.errors.any? %>

    <div class="row">

        <div class="col-xs-8 col-xs-offset-2">

            <div class="panel panel-danger">


                <div class="panel-body">

                    <ul>

                        <% obj.errors.full_messages.each do |msg| %>

                            <li><%= msg %></li>

                        <% end %>

                    </ul>

                </div>

            </div>

        </div>

    </div>

</div>

<% end %>

新的部分代码:

<%= render 'shared/errors', obj: customer  %>
    <%= form_for customer do |f| %>
            <div class= "form-group">
                <div class= "row reg_row">
                    <%= f.text_field :first_name, class: "col-sm-6 form-control", placeholder: "first name", required: true, autofocus: true %>
                    <%= f.text_field :last_name, class: "col-sm-6 form-control", placeholder: "first name", required: true, autofocus: true %>
                </div>
                <div class= "row reg_row">
                    <%= f.email_field :email, class: "col-sm-6 form-control", placeholder: "email", required: true, autofocus: true %>
                    <%= f.password_field :password, class: "col-sm-6 form-control", placeholder: "password", required: true, autofocus: true %>
                </div>
                <div class= "row button-margin">
                    <%= f.submit "Sign up", class: "btn btn-primary" %>

                </div>
            </div>
    <% end %>

页面控制器:

class PagesController < ApplicationController

    def index

    end

    def about

    end

    def faq

    end

    def contact

    end

    def registration

    end

    def login

    end

end

如果我在呈现新操作时将新初始化的客户对象添加到注册文件中,此代码会起作用吗?

所以我编辑代码以在传递注册文件呈现新部分时创建的客户变量时从新部分呈现错误部分,所以现在错误成为 pages#registration 中的名称错误,错误留言阅读

undefined local variable or method `customer' for #<#<Class:0x007fa6497deb40>:0x007fa648e32268>
Did you mean?  customer_url

【问题讨论】:

  • 试试&lt;%= render("customers/new", obj: @customer) %&gt;
  • 等待在主视图页面中呈现部分错误的位置?
  • 我应该在哪里包含这行代码?
  • 您说的代码属于错误部分。它的文件名是什么以及你实际渲染它的位置?
  • 我在新的partial中渲染了它,但是我只是更改了代码,现在在注册文件中渲染了error partial

标签: html ruby-on-rails ruby error-handling registration


【解决方案1】:

从您的错误消息中,我们可以得出结论,您的 obj 在某处设置为 nil。否则,您将收到NameError: undefined local variable or method 错误。

确保正确设置了 obj 局部变量。如果可以是nil,则添加if检查或使用try()方法。

<% if obj && obj.errors.any? %>

  # OR

<% if obj.try(:errors).try(:any?) %>

  # OR, if you are using Ruby 2.3 or later

<% if obj&.errors&.any? %>

【讨论】:

  • 其实错误也说NoMethodError in Pages#registration
  • 好吧,然后添加Pages#registration 操作和完整的错误回溯。这样我们就不会坐在这里猜测......
  • 我实际上从一开始就包含了注册文件,页面控制器中的注册操作是一个空方法,因为它只是作为部分新操作的中间页面而已
  • 那是一个注册erb文件,不是吗?请包含控制器代码。
【解决方案2】:
<div id="tabs">
  <ul>
    <li><a href="#customer_register">Customer</a></li>
    <li><a href="#vendor_register">Vendor</a></li>
  </ul>
  <div id="customer_register">
  <%= render("customers/new") %> # THIS IS NOT A PARTIAL

  </div>
  <div id="vendor_register">
  <%= render("vendors/new") %>   # THIS IS NOT A PARTIAL
  </div>
</div>

如果是局部的,你需要做这样的事情。

&lt;%= render "customers/new", customer: @customer %&gt;

然后,在您的customer/new.html.erb 中,您将所有内容都称为customer,因为该变量现在存在。很可能是因为您没有将模型传递给嵌套模板部分,所以您会得到一个 undefined methoderrors' for nil:NilClass`

【讨论】:

  • 所以我按照你所说的通过将客户对象传递给部分来修复它,但错误仍然存​​在,所以我认为问题是将客户对象传递到注册页面以及该对象的一些方式设置为零。
  • 好的,那就这样做吧。不要在该控制器中调用渲染,而是使用'redirect_toregistrations_pages_path'(如果您不确定路径是什么,请使用'rake routes'。然后在'registration'操作中,如果你已经这样做了,你可以创建一个@customer .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 2013-07-16
相关资源
最近更新 更多